【问题标题】:How to use itertools.groupby on a file [duplicate]如何在文件上使用 itertools.groupby [重复]
【发布时间】:2017-10-05 23:43:56
【问题描述】:

我有一个文件,如下图。我计划使用 itertools.groupby 创建一个包含块数据的列表列表,但我很难找出将行拆分为列表块的关键部分。

有什么想法吗?

with open(infile) as f:
    blocks = []
    for key, val in itertools.groupby(f, lambda x:):
        if key:
            blocks.append(list(val))

输入:

Timestamp         : 2017-02-17 06:41:33.163000 EST
Event             : fabric
DataFields        : Zen
Timestamp         : 2017-02-17 06:41:33.163000 EST
Event             : application
DataFields        : Flood1
Timestamp         : 2017-02-17 06:41:33.163000 EST
Event             : fabric
DataFields        : Flood2
Timestamp         : 2017-02-17 06:41:33.163000 EST
Event             : application
DataFields        : Flood3 

输出: 应该是列表列表

[列表1,列表2,列表3,列表4]

list1 = [Timestamp         : 2017-02-17 06:41:33.163000 EST, Event             : fabric, DataFields        : Zen]
list2 = [Timestamp         : 2017-02-17 06:41:33.163000 EST, Event             : application, DataFields        : Flood1]
list3 = [Timestamp         : 2017-02-17 06:41:33.163000 EST, Event             : fabric, DataFields        : Flood2]
list4 = [Timestamp         : 2017-02-17 06:41:33.163000 EST, Event             : application, DataFields        : Flood3]

【问题讨论】:

  • 我没有看到你在这里分组...
  • 你不需要那个功能。您需要学习一次将三行文件解析为单个对象
  • @cricket_007:想要基本解析文件,并将它们划分为列表块

标签: python


【解决方案1】:

如果您使用groupby 关闭Timestamp,它将在生成时间戳行和非时间戳行的生成器之间交替。您可以使用它来创建新的子列表并使用包含的数据扩展它们。

import itertools

with open('test.txt') as f:
    blocks = []
    for is_timestamp, lines in itertools.groupby(
            (line.strip() for line in f), 
            lambda line: line.startswith('Timestamp')):
        if is_timestamp:
            # saw a timestamp - start a new inner list
            blocks.append(list(lines))
        else:
            # extend with not timestamp stuff
            blocks[-1].extend(list(lines))

for block in blocks:
    print(block)

运行测试,我得到了

td@mintyfresh ~/tmp $ python3 test.py
['Timestamp         : 2017-02-17 06:41:33.163000 EST', 'Event             : fabric', 'DataFields        : Zen']
['Timestamp         : 2017-02-17 06:41:33.163000 EST', 'Event             : application', 'DataFields        : Flood1']
['Timestamp         : 2017-02-17 06:41:33.163000 EST', 'Event             : fabric', 'DataFields        : Flood2']
['Timestamp         : 2017-02-17 06:41:33.163000 EST', 'Event             : application', 'DataFields        : Flood3', '']

【讨论】:

  • 非常感谢,这行得通!
猜你喜欢
  • 2010-09-05
  • 2014-02-12
  • 1970-01-01
  • 2013-05-29
  • 2023-04-08
  • 2013-10-30
  • 2019-11-01
  • 2012-10-08
相关资源
最近更新 更多