[英]Converting block of txt lines to list of dictionaries python
我有一個這樣的通用txt
:
name: John
surname: 'Doe'
company: 'Municipality'
email: john@doe.com
name: John2
surname: 'Doe2'
company: 'Municipality2'
email: john2@doe2.com
name: John3
surname: 'Doe3'
company: 'Municipality3'
email: john3@doe3.com
name: John4
surname: 'Doe4'
company: 'Municipality4'
email: john4@doe4.com
用空線分隔每個人。 將文件轉換為字典列表的最佳方法是什么? 每本詞典都是一個人。
你可以在\n\n
上split
然后做線,
>>> l = []
>>> for block in f.read().strip().split('\n\n'):
... d = {}
... for line in block.split('\n'):
... if not line.strip():continue
... key, value = line.strip().split(':')
... d[key.strip()] = value.strip("' ") # strip the `'` and/or `space` at both ends in `value`
... l.append(d)
...
>>> import pprint
>>> pprint.pprint(l)
[{'company': 'Municipality',
'email': 'john@doe.com',
'name': 'John',
'surname': 'Doe'},
{'company': 'Municipality2',
'email': 'john2@doe2.com',
'name': 'John2',
'surname': 'Doe2'},
{'company': 'Municipality3',
'email': 'john3@doe3.com',
'name': 'John3',
'surname': 'Doe3'},
{'company': 'Municipality4',
'email': 'john4@doe4.com',
'name': 'John4',
'surname': 'Doe4'}]
你可以這樣做:
def convert_text(txt):
dct = {}
for line in txt.splitlines():
if not line: # Blank line
yield dct
dct = {}
else:
key, value = line.split(': ', 1)
dct[key] = value
yield dct
result = []
for each in data.split('\n\n'):
d = {}
for line in filter(None, each.split('\n')):
k, v = line.split(':')
d[k.strip()] = v.strip("' ")
result.append(d)
結果是:
In [95]: result
Out[95]:
[{'name': 'John',
'surname': 'Doe',
'company': 'Municipality',
'email': 'john@doe.com'},
{'name': 'John2',
'surname': 'Doe2',
'company': 'Municipality2',
'email': 'john2@doe2.com'},
{'name': 'John3',
'surname': 'Doe3',
'company': 'Municipality3',
'email': 'john3@doe3.com'},
{'name': 'John4',
'surname': 'Doe4',
'company': 'Municipality4',
'email': 'john4@doe4.com'}]
你可以用itertools.groupby
試試這個:
from itertools import groupby
with open('filename.txt','r') as f:
lines = [l.strip('\n') for l in f]
groups = groupby(lines,key=bool)
final_list = [{val.split(':')[0]:val.split(':')[1].strip("' ") for val in g} for k,g in groups if k]
最終清單:
[{'company': 'Municipality',
'email': 'john@doe.com',
'name': 'John',
'surname': 'Doe'},
{'company': 'Municipality2',
'email': 'john2@doe2.com',
'name': 'John2',
'surname': 'Doe2'},
{'company': 'Municipality3',
'email': 'john3@doe3.com',
'name': 'John3',
'surname': 'Doe3'},
{'company': 'Municipality4',
'email': 'john4@doe4.com',
'name': 'John4',
'surname': 'Doe4'}]
嘗試這個,
final_list = []
with open('file1.txt', 'r') as file:
_temp = {}
for line in file:
if line !='\n':
_temp.setdefault(line.split(':')[0].strip(), line.split(':')[1].replace('\n', '').strip())
else:
final_list.append(_temp)
_temp = {}
print(final_list)
Output:
[{'company': "'Municipality'",
'email': 'john@doe.com',
'name': 'John',
'surname': "'Doe'"},
{'company': "'Municipality2'",
'email': 'john2@doe2.com',
'name': 'John2',
'surname': "'Doe2'"},
{'company': "'Municipality3'",
'email': 'john3@doe3.com',
'name': 'John3',
'surname': "'Doe3'"}]
使用正則表達式。
前任:
result = [{}]
with open(filename) as infile:
for line in infile: #Iterate each line
line = line.strip() #Check for empty line
if line:
key, value = re.match(r"(\w+):\s*'?(\w+)'?", line.strip()).groups() #Get key-value pair
result[-1][key] = value
else:
result.append({})
print(result)
Output:
[{'company': 'Municipality', 'email': 'john', 'name': 'John', 'surname': 'Doe'},
{'company': 'Municipality2',
'email': 'john2',
'name': 'John2',
'surname': 'Doe2'},
{'company': 'Municipality3',
'email': 'john3',
'name': 'John3',
'surname': 'Doe3'},
{'company': 'Municipality4',
'email': 'john4',
'name': 'John4',
'surname': 'Doe4'}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.