将数据从文件读入字典

2024-04-19 19:16:08 发布

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

假设我有一个包含每一行信息的文件,每一行我都想在字典中转换。字典里有一个字符串,两个整数和两个列表。有点像这样: Q1={“string”:“名称”, “整数1”:1, “整数2”:2, “list1”:[a,b,c,d], “list2”:[] } 现在这个文件可以是txt文件,也可以不是。假设它是一个txt文件,每一行都会提供一个字典。我是一个写的文件,这样我就可以有它在任何格式我想要的。我以为每行文件.txt: 名称,1,2,(a/b/c),() 所以第一个是字符串,第二个是integer1,然后是integer2,list1和list2。字典中的每个元素用逗号分隔,列表中的元素用括号分隔,用斜杠(“/”)分隔。显然如果你认为有更好的办法文件.txt想请让我知道:) 第一个列表我希望它是动态的。这意味着某些行的括号()中可能包含更多字符,我希望第二个列表始终为空,因为我稍后会在代码中放一些东西。 每一行都是一个字典,每一个字典都是我要创建的列表中的一个元素。所以我想要一份字典清单。你知道吗

我试着打开一个文件并使用split函数,但是txt文件的格式比我想象的要复杂,而且从来没有读过这个文件并将它保存到字典列表中

#the file.txt should look like this:
name1,5,6,(a1/a2/a3), ()
name2,7,8,(a2/a3/a4/a5), ()

#the python code i tried:
def init():
    myList=[]
    with open("file.txt") as f:
        for line in f:
            d={}
            d = dict(line.strip().split(',', 4))
            myList[line]=d
return(myList)        

list=[]
list=init();

Tags: 文件字符串txt名称元素列表字典格式
3条回答

检查这个。。。不用任何包装。你知道吗

with open("test.txt") as f:
  lines = [ line.strip().split(",") for line in f ]
  lines = [{ 
        "string": line[0], 
        "integer1": int(line[1]), 
        "integer2": int(line[2]), 
        "list1": [l for l in line[3].strip("()").split("/")],
        "list2": [l for l in line[4].strip("()").split("/")],
  } for line in lines ]
  print(lines)

内部文件1.txt

hey1,5,6,(a1/a2/a3),()
hey2,7,8,(a2/a3/a4/a5),()

您可以使用下面的代码,它将为每一行生成一个新的字典,最后生成dict\ u main中的所有字典。你知道吗

index1=['string1','integer1','integer2','list1','list2']
dict_main={}
with open ('file1.txt') as f:
    count=0
    for line in f:
        dict1={}
        lst1=line.strip().split(',')
        dict1[index1[0]]=lst1[0]
        dict1[index1[1]]=int(lst1[1])
        dict1[index1[2]]=int(lst1[2])
        dict1[index1[3]]=lst1[3][1:-1].strip().split('/')
        dict1[index1[4]]=[]
        count+=1
        dict_main['dict'+str(count)]=dict1
print(dict_main)

结果

{'dict1': {'integer2': 6, 'list2': [], 'integer1': 5, 'list1': ['a1', 'a2', 'a3'], 'string1': 'hey1'}, 'dict2': {'integer2': 8, 'list2': [], 'integer1': 7, 'list1': ['a2', 'a3', 'a4', 'a5'], 'string1': 'hey2'}}

为此,可以使用^{}。你知道吗

对于给定的示例文件,您可以这样使用它:

from csv import DictReader

FIELD_NAMES = ["string", "integer1", "integer2", "list1", "list2"]

with open("file_name.csv") as f:
    reader = DictReader(f, fieldnames=FIELD_NAMES)
    for line in reader:
        # line["integer1"] = int(line["integer1"])
        # ...
        print(line)
# OrderedDict([('string', 'name1'), ('integer1', '5'), ('integer2', '6'), ('list1', '(a1/a2/a3)'), ('list2', ' ()')])
# OrderedDict([('string', 'name2'), ('integer1', '7'), ('integer2', '8'), ('list1', '(a2/a3/a4/a5)'), ('list2', ' ()')])

如您所见,它将每个字段作为一个字符串进行计算,因此您必须将解析添加到整数和列表中,但这应该可以让您开始。你知道吗

它还返回OrderedDict,以确保字段的顺序。如果需要,可以使用dict()将它们转换为普通dict。你知道吗

要得到一个目录,只需执行以下操作:

with open("file_name.csv") as f:
    reader = DictReader(f, fieldnames=FIELD_NAMES)
    print(list(reader))
# [OrderedDict([('string', 'name1'), ('integer1', '5'), ('integer2', '6'), ('list1', '(a1/a2/a3)'), ('list2', ' ()')]), OrderedDict([('string', 'name2'), ('integer1', '7'), ('integer2', '8'), ('list1', '(a2/a3/a4/a5)'), ('list2', ' ()')])]

稍不相关:

  • 不要通过调用列表来隐藏内置的list
  • return不需要括号中的参数,return后面的空格就足够了。你知道吗
  • 阅读Python的官方风格指南PEP8。你知道吗

相关问题 更多 >