从txt文件创建字典

k7fdbhmy  于 2021-07-13  发布在  Java
关注(0)|答案(4)|浏览(495)

我有一个txt文件,我想在字典中转换。txt的每个文件都由四个用分号分隔的str组成。每个str都是字典的值。我尝试了下面的代码,但我不知道如何继续。
text=“1;迈克;棕色;73/04/01; 2;安娜;史密斯;71/02/01"
文件=打开(“people.txt”,“w”)
文件写入(tex)
file.close()file=open>(“people.txt”,“r”)
text=file.read()
文件.close()
list=>text.split(“;”)keys=['id','name','family name','birth']
预期:

id: 1
name: Mikael
family name: Brown
Birth: 73/04/01

id: 2
name: Anna
family name: Smith
Birth: 71/02/01

谢谢

cclgggtu

cclgggtu1#

使用csv和dictreader
t、 文本

id;name;family name;Birth
1;Mike;Brown;73/04/01
2;Anna;Smith;71/02/01

脚本

import csv

with open('t.txt','r') as file:
    f=csv.DictReader(file,delimiter=';')
    for i in f:
        print(i)

输出

{'id': '1', ' name': 'Mike', ' family name': 'Brown', ' Birth': '73/04/01'}
    {'id': '2', ' name': 'Anna', ' family name': 'Smith', ' Birth': '71/02/01'}
oo7oh9g9

oo7oh9g92#

textlst = text.split(';')
dictlst = []
for i in range(0, len(textlst), 4):
    dictlst.append({"id" : int(textlst[i]), "name": textlst[i+1],  "family name": textlst[i+2], "Birth": textlst[i+3])

将整个文件作为一个字符串,然后用分号将其拆分,因为我们知道要按4进行,所以我们创建了一个for循环,每次跳4。然后我有一个dictlst数组,我每4步就添加一个

mkshixfv

mkshixfv3#

这可能有点离题,但是
如果“;”界定记录,以及
";" 然后划分字段
这样,除了文件i/o之外,还会产生您想要的输出:

if __name__ == '__main__':
    KEYS = ['id', 'name', 'family name', 'Birth']
    DATA = '1;Mike;Brown;73/04/01; 2;Anna;Smith;71/02/01;'

    things = []
    # assuming "; " separates logical records...
    for line in DATA.split('; '):
        result = {}
        values =  line.split(';')
        for key, value in zip(KEYS, values):
            # of course, one could just as easily print/persist here directly, but
            #  perhaps resulting dict is useful in other places 
            result[key] = value
        things.append(result)

    for record in things:
        for key, value in record.items():
            print(f'{key}: {value}')

# running this as a script produces:

id: 1
name: Mike
family name: Brown
Birth: 73/04/01
id: 2
name: Anna
family name: Smith
Birth: 71/02/01

或者,如果你更喜欢互动式的列表/听写理解方法:

>>> data = '1;Mike;Brown;73/04/01; 2;Anna;Smith;71/02/01;'
>>> keys = ['id', 'name', 'family name', 'Birth']
>> [{k: v for k, v in zip(keys, line.split(';'))} for line in data.split('; ')]
[{'id': '1', 'name': 'Mike', 'family name': 'Brown', 'Birth': '73/04/01'}, {'id': '2', 'name': 'Anna', 'family name': 'Smith', 'Birth': '71/02/01'}]
jtjikinw

jtjikinw4#

我继续假设您可以将每个字典键与文本文件中所有行的匹配列表相关联。
我的意思是如果 personal_data 那么你的字典就会有以下内容:

>>> personal_data["id"]
[1, 2]

下面是根据需要构建dict的代码。我将省略任何处理不正确格式的代码,并假设每个条目都具有相同顺序的键,并且文本文件中的值组不包含空格。

personal_data = {'id':[],'name': [], 'family name': [], 'Birth': []}
keys = list(personal_data.keys())

# this is preferential to using open() and close()

with open('people.txt','r') as file_iterator: 
  for line in file_iterator:
     for entry in line.split(): # assuming fields don't contain spaces
       for i, value in enumerate(entry.split(';')):
         if i < len(keys): # to prevent IndexErrors in the case of a semicolon at the end
           personal_data[keys[i]].append(value)

在我的python 3.9.2安装中,我得到:

{'id': ['1', '2'],
 'name': ['Mike', 'Anna'],
 'family name': ['Brown', 'Smith'],
 'Birth': ['73/04/01', '71/02/01']}

如果可能的话,我认为修改文本文件的布局以使其更易于修改确实会让您受益匪浅。即,将每个人的条目跨行拆分。而不是:

1;Mike;Brown;73/04/01; 2;Anna;Smith;71/02/01

你可以:

1;Mike;Brown;73/04/01
2;Anna;Smith;71/02/01

这样做的主要动机是它可以更容易地处理那些可能有空格的值,比如“maria jos”é", "莎拉·林恩,“德拉·克鲁兹”。一般来说,构建能够处理名称的软件是相当棘手的。
正如您可能注意到的,这样的数据非常适合表格格式,就像您在电子表格中看到的那样。也许把它放在pandas.dataframe对象中会有好处?该链接将带您访问他们文档中的教程,这将帮助您确定该教程是否有用。

相关问题