我有一个文字,如下:
method
我想要的是什么:
[1]
aaa
bbb
[2]
ccc
ddd
我可以将此文字与{ 'title1': [ 'aaa', 'bbb' ],
'title2': [ 'ccc', 'ddd' ] }
分开并使用\n
和一些for
语句来完成此操作,但没有'pythonic',优雅的方式吗?密钥类型(if
)是有限的。
编辑:我的尝试就在这里,所以硬编码:
[1], [2]
答案 0 :(得分:2)
from collections import defaultdict
result = defaultdict(list)
current_key = "ERROR - MISSING TITLE"
with open('youfile.txt', 'r') as f:
for line in f:
item = line.strip()
if item.strip('[]') != item:
current_key = item.strip('[]')
else:
result[current_key].append(item)
如果您不想使用defaultdict
,可以执行result = {}
并将result[current_key].append(item)
更改为result.setdefault(current_key, []).append(item)
。
答案 1 :(得分:1)
您可以使用groupby将不以[
开头的行与OrderedDict分组,以保持数据在文件中出现的顺序:
from itertools import groupby, imap
from collections import OrderedDict
with open("in.txt") as f:
grouped = groupby(imap(str.rstrip, f), lambda x: x[0] == "[")
od = OrderedDict(("title{}".format(next(v).strip("[]")), list(next(grouped)[1]))
for k, v in grouped)
输出:
OrderedDict([('title1', ['aaa', 'bbb']), ('title2', ['ccc', 'ddd'])])
如果数字始终从1开始,只需使用enumerate,其起始索引为1:
od = OrderedDict(("title{}".format(ind), list(next(grouped)[1]))
for ind, (k, v) in enumerate(grouped, 1))
答案 2 :(得分:0)
您似乎正在尝试解析配置文件,python configparser可以提供帮助,因此您无需重新发明轮子。参考页面末尾的示例。
>>> import ConfigParser >>> import io >>> >>> sample_config = """ ... [1] ... aaa ... bbb ... [2] ... ccc ... ddd ... """ >>> config = ConfigParser.RawConfigParser(allow_no_value=True) >>> config.readfp(io.BytesIO(sample_config)) >>> config.sections() ['1', '2'] >>> config.items("1") [('aaa', None), ('bbb', None)] >>> config.items("2") [('ccc', None), ('ddd', None)]