将文件中的字符串分组为字典

时间:2015-07-04 20:02:38

标签: python python-3.x dictionary

我试图将列表中的字符串分组到字典中。我在一个文件中读取以获取字符串列表。我想拿这个列表并按照他们的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)

2 个答案:

答案 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}}