我试图将列表中的字符串分组到字典中。我在一个文件中读取以获取字符串列表。我想拿这个列表并按照他们的ID对所有项目进行分组。
这是文件(logtest.txt)包含的内容......
Id: 1
FATAL ERROR: Network error: Connection timed out
Done
Return Code: 0
Id: 2
FATAL ERROR: Network error: Connection timed out
Done
Return Code: 0
Id: 3
FATAL ERROR: Network error: Connection timed out
Done
Return Code: 0
到目前为止,我将文件中的所有行都读入列表中。我想接受这些字符串并将它们按id
数字分组到一个字典中,其中键是id
数字,值是从Id: 1
到下一个字符串的所有字符串包含Id:
。
def getAllTheLinesInLogFile():
f = open('logtest.txt', 'r')
return f.readlines()
def getDictOfItems(allLinesInFile):
dict = {}
# ???
# items = allLinesInFile.groupby()
for item in items:
print("{0}".format(item))
return dict
logFile = open('logtest.txt', 'w+')
allLinesInLogFile = getAllTheLinesInLogFile()
dictOfItems = getDictOfItems(allLinesInLogFile)
for item in dictOfItems:
print(item.key)
答案 0 :(得分:2)
您可以使用itertools.groupby
对按Id:
分隔的部分进行分组:
from itertools import groupby
with open("in.txt") as f:
d = {}
groups = groupby(f, lambda x: x.startswith("Id:"))
for k, v in groups:
if k: # if we have a line with "Id:.."
# use the line as the key
k = next(v).rstrip()
# call next on the grouper object extracting
# the second item which is our section of lines
d[k] = list(map(str.rstrip, next(groups)[1]))
输入:
Id: 1
FATAL ERROR: Network error: Connection timed out
Done
Return Code: 0
Id: 2
FATAL ERROR: Network error: Connection timed out
Done
Return Code: 0
Id: 3
FATAL ERROR: Network error: Connection timed out
Done
Return Code: 0
输出:
from pprint import pprint as pp
{'Id: 1': ['FATAL ERROR: Network error: Connection timed out',
'Done',
'Return Code: 0'],
'Id: 2': ['FATAL ERROR: Network error: Connection timed out',
'Done',
'Return Code: 0'],
'Id: 3': ['FATAL ERROR: Network error: Connection timed out',
'Done',
'Return Code: 0']}
如果您的数据实际上有多个空行,则代码仍然有效,如果您不想使用空行,则可以对其进行过滤。如果您想保留换行符,只需删除str.rstrip
来电。
如果你打算在完成一些工作后覆盖文件,那么在你去的时候写一个临时文件可能是一个更好的方法。
答案 1 :(得分:1)
我并不完全清楚你在问什么,但也许这会有所帮助:
{{1}}