将txt行块转换为字典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

,用空行分隔每个。将文件隐藏为词典列表的最佳方法是什么?每本词典都是一个人。

andy_69 回答:将txt行块转换为字典python

您可以在split\n\n,然后进行换行,

>>> 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','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)

输出:

[{'company': "'Municipality'",'surname': "'Doe'"},{'company': "'Municipality2'",'surname': "'Doe2'"},{'company': "'Municipality3'",'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)

输出:

[{'company': 'Municipality','email': 'john','email': 'john2','email': 'john3','email': 'john4','surname': 'Doe4'}]
本文链接:https://www.f2er.com/3112188.html

大家都在问