将TXT转换为字典



我有一个txt文件,有10个键的头,有超过1000行字符串和数字,我想阅读它们,并在字典格式做一些分析。(我尝试了一些我可以搜索的代码,它们要么会说太多的值要解包,要么没有足够的值要解包。)

例如,TXT文件可以像这样:

name age city job food ... address
Amy 26 London lawyer fish ... WE09KT
...
Lisa 30 LA teacher egg ... LY76SU

我希望输出像字典一样:

[{name: Amy,age: 26,city: London,...}{name: Lisa, age: 30, ...}]

有人让我访问这里,但输出将是{'name age city job ... address':['amy ... lisa','26 ... 30',...]},这不是我想要的。(是的,我甚至不知道我甚至没有得到链接显示的内容:像{name:[Amy, ..., Lisa],age:[26,...,30],...}这样的返回),有人能告诉我原因吗?

再次感谢您的帮助,希望这澄清并能得到答案!

尝试使用.readlines,然后将zip的第一行与其他行组合成dict_list中的每个字典。下图:

input_fp = 'x.txt' ## set the path to the ACTUAL file
sep_str = None # ' ' # ',' # ' | ' # 't' # 
with open(input_fp) as f:
# text_lines = [l.rstrip() for l in f.readlines()] # keep empty lines
text_lines = [l.rstrip() for l in f.readlines() if l.strip()] ## no empty lines
dKeys = text_lines[0].split(sep_str) if text_lines else [] 
maxSplits = len(dKeys) - 1
dict_list = [dict(zip(dKeys, tl.split(sep_str,maxSplits))) for tl in text_lines[1:]]
  • 你也可以使用f.read().strip().splitlines()来代替f.readlines()和省略if l.strip()部分,如果你想跳过空格在开始,但仍然表示空行稍后与空字典({})。
  • 使用l.strip()代替l.rstrip()如果你可能在行开始有空格,你需要忽略。
  • 省略maxSplits,如果您不想将最后一个"单词"混在一起,如果一行的"单词"比第一行多。例如,如果您的文件包含'k1 k2 k3nv1 v2 v3 v4',则
    • 和上面一样,它将被转换为[{'k1': 'v1', 'k2': 'v2', 'k3': 'v3 v4'}]
    • ,但如果您只使用
      dict_list = [dict(zip(dKeys, tl.split(sep_str))) for tl in text_lines[1:]]
      
      那么结果dict_list将是[{'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}](例如,v4将被裁剪出来,而不是被附加到v3上)
  • 关于sep_str的值,将用于.split每一行的值:
    • sep_str=None—>'v1 v2 v3'.split()返回['v1', 'v2', 'v3']
    • sep_str= ' '—>'v1 v2 v3'.split(' ')返回['v1', '', 'v2', 'v3']

例如,如果您的文件包含

First_Name Last_Name Gender Age Phone Occupation
Penelope Miller Female 23 069-5515-87 Teacher
Julian Watson Male 19 355-0427-79 Cook
Gianna Barnes Female 27 641-6494-91 Mechanic
Walter Walker Male 28 164-8407-47 Mechanic
Chelsea Scott Female 28 272-2601-10 Florist

则结果dict_list应该是:

[
{'First_Name': 'Penelope', 'Last_Name': 'Miller', 'Gender': 'Female', 'Age': '23', 'Phone': '069-5515-87', 'Occupation': 'Teacher'},
{'First_Name': 'Julian', 'Last_Name': 'Watson', 'Gender': 'Male', 'Age': '19', 'Phone': '355-0427-79', 'Occupation': 'Cook'},
{'First_Name': 'Gianna', 'Last_Name': 'Barnes', 'Gender': 'Female', 'Age': '27', 'Phone': '641-6494-91', 'Occupation': 'Mechanic'},
{'First_Name': 'Walter', 'Last_Name': 'Walker', 'Gender': 'Male', 'Age': '28', 'Phone': '164-8407-47', 'Occupation': 'Mechanic'},
{'First_Name': 'Chelsea', 'Last_Name': 'Scott', 'Gender': 'Female', 'Age': '28', 'Phone': '272-2601-10', 'Occupation': 'Florist'}
]

最新更新