如何将此文本文件转换为词典?

2024-09-30 06:33:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件f,看起来像:

#labelA
there
is
something
here
#label_Bbb
here
aswell
...

它可以在一行上有多个标签和任意数量的元素(只有str),每个标签有多行。 我想将这些数据存储在字典中,例如:

^{pr2}$

我有许多子问题:

  1. 如何使用Ť字符以了解新条目何时到位?在
  2. 如何移除它,并将后续内容保留到行尾?在
  3. 怎么可能在新行中追加后面的每个字符串,直到#再次弹出。在
  4. 文件完成后,我该如何停止?在

Tags: 文件数据元素数量字典hereis标签
3条回答

首先,mydict包含以#开头的键,值是一个列表(list可以保持行的附加顺序),我们在这个列表中追加行,直到找到下一行以#开头。然后我们只需要将行列表转换成一个字符串。在

我使用python3,如果使用python2将mydict.items()替换为mydict.iteritems()来迭代键值对

mydict = dict()
with open("sample.csv") as inputs:
    for line in inputs:
        if line.startswith("#"):
            key = line.strip()[1:]
            mydict.setdefault(key,list())
        else:
            mydict[key].append(line.strip())

result = dict()
for key, vlist in mydict.items():
    result[key] = "".join(vlist)

print(result)

输出:

^{pr2}$
f = open('untitled.txt', 'r')

line = f.readline()
d = {}
last_key = None
last_element = ''
while line:
    if line.startswith('#'):
        if last_key:
            d[last_key] = last_element
            last_element = ''
        last_key = line[:-1]
        last_element = ''
    else:
        last_element += line
    line = f.readline()

d[last_key] = last_element

使用re.findall()函数的最短解:

import re 

with open("lines.txt", 'r') as fh:
    d = {k:v.replace('\n', '') for k,v in re.findall(r'^#(\w+)\s([^#]+)', fh.read(), re.M)}

print(d)

输出:

^{pr2}$

re.findall将返回元组列表,每个元组包含两个表示两个连续捕获组的项

相关问题 更多 >

    热门问题