我在将文本文件解析到字典中时遇到问题

2024-06-26 00:12:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文本文件,我想把它加载到Python的字典中。你知道吗

文本如下所示,制表符无效:

Form Dosage ReferenceDrug drugname activeingred INJECTABLE; INJECTION 20,000 UNITS/ML LIQUAEMIN SODIUM HEPARIN SODIUM INJECTABLE; INJECTION 40,000 UNITS/ML LIQUAEMIN SODIUM HEPARIN SODIUM INJECTABLE; INJECTION 5,000 UNITS/ML LIQUAEMIN SODIUM HEPARIN SODIUM

现在我的代码看起来是这样的,但它不起作用(列表索引超出范围,没有任何内容被推到字典中)。我不知道我哪里出错了,不是一个程序员。谢谢你的帮助。你知道吗

import sys

def load_medications(filename):
    meds_dict = {}
    f = open(filename)
    l = " "
    # print f.read()
    for line in f:
        fields = l.split("\t")
        ApplNo = fields[0]
        ProductNo = fields[1]
        Form = fields[2]
        Dosage = fields[3]
        ProductMktStatus = fields[4]
        TECode = fields[5]
        ReferenceDrug = fields[6]
            DrugName = fields[7]
        ActiveIngred = fields[8]

        meds = {
                "ApplNo": ApplNo,   
                "ProductNo": ProductNo, 
                "Form": Form,
                "Dosage": Dosage,   
                "ProductMktStatus": ProductMktStatus,
                "TECode": TECode,
                "ReferenceDrug": ReferenceDrug, 
                "DrugName": DrugName,
                "ActiveIngred": ActiveIngred
            }       
        meds_dict[DrugName] = meds
    f.close()
    return meds_dict


def main():
    x = load_medications("druglist.txt")
    print x



if __name__ == "__main__":
    main()

Tags: formfieldsmldictunitsinjectioninjectablemeds
3条回答

the CSV module in the standard library解析这些数据可能会更容易—如果用制表符作为分隔符,;作为行终止符,解析发布的文件应该不会有问题。你知道吗

使用DictReader还可以使您的行更容易阅读(您可以将事物称为line['ApplNo'],而不是line[0])。你知道吗

不幸的是,文件中的头看起来不像映射到代码中要调用的名称,因此需要根据字典中的内容自己指定字段的名称。你知道吗

尝试line.split而不是l.split?你知道吗

既然字段名都是有效的Python标识符,为什么不将数据读入namedtuples而不是dict呢?你知道吗

data = """Form Dosage ReferenceDrug drugname activeingred INJECTABLE; INJECTION 20,000 UNITS/ML LIQUAEMIN   SODIUM HEPARIN  SODIUM  INJECTABLE; INJECTION   40,000 UNITS/ML LIQUAEMIN   SODIUM HEPARIN  SODIUM  INJECTABLE; INJECTION   5,000 UNITS/ML  LIQUAEMIN   SODIUM HEPARIN  SODIUM  INJECTABLE""".split('; ')

from collections import namedtuple

# define class DrugData as a namedtuple, using the headers from data[0]
DrugData = namedtuple("DrugData", data[0])

# use a list comprehension to create a DrugData for each data line
druglist = [DrugData(*line.split('\t')) for line in data[1:]]

# access each tuple in druglist, using attribute access to individual fields
for d in druglist:
    print "%s | %s | %s" % (d.ReferenceDrug, d.Form, d.Dosage)

印刷品:

LIQUAEMIN | INJECTION | 20,000 UNITS/ML
LIQUAEMIN | INJECTION | 40,000 UNITS/ML
LIQUAEMIN | INJECTION | 5,000 UNITS/ML

编辑:

回顾您原来的问题,看起来您想创建一个包含所有这些条目的dict,由drugname键控。不幸的是,dict键必须是唯一的,在您的示例中,所有3个条目都具有相同的drugname。您可能需要组合2个或更多字段,才能为处理所有这些值的dict(例如(drugname, Dosage)元组)组成一个真正唯一的键。你知道吗

或者,稍微更改一下设计,使每个drugname指向一个匹配值的列表。最简单的方法是使用defaultdict而不是dict,这样新条目就会自动初始化为空列表。在代码中,您将添加一个import语句:

from collections import defaultdict

并将药物声明改为:

meds_dict = defaultdict(list)

这意味着,任何尚未看到的新键都将使用作为defaultdict参数提供的函数/类进行初始化,在本例中是list。你知道吗

然后,要将新条目添加到药物目录中,而不是用“=”赋值,您需要附加到所有匹配药物/剂量的列表中:

meds_dict[DrugName].append(meds)

现在,对于任何药品名称,您将得到匹配的表单/剂量/等记录的列表。你知道吗

相关问题 更多 >