簡體   English   中英

將 txt 行塊轉換為字典列表 python

[英]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\nsplit然后做線,

>>> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM