首页 > 解决方案 > 使用 Python 在文本文件中合并第 1-8、9-16 行等

问题描述

我有一个大文本文件,如下所示:

line1: Date

line2: data

line3: data

line4: data

line5: data

line6: data

line7: data

line8: (blank)

line9: Date (repeats itself from here)

我需要读取这个 txt 文件并将第 1-8 行合并到一行,将此行保存为变量,然后转到第 9-16 行,合并到一行,将此行另存为变量等。知道如何编码这个?或者,如果有一种方法可以删除除每 8 个 '\n' 之外的每个 '\n',这可能更容易,但我不知道如何。

标签: pythonpython-2.7fopen

解决方案


查看文档grouper中的itertools食谱:

from itertools import zip_longest

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

现在您可以遍历每组 8 行:

with open(path) as f:
    for group in grouper(f, 8):

如果您想将每个组连接到一个字符串中,您可以将其写入新文件:

with open(path) as f:
    for i, group in enumerate(grouper(f, 8)):
        with open(f'out_{i}.txt', 'w') as outf:
            outf.write(''.join(group))

如果要将所有内部换行符变成空格:

with open(path) as f:
    for i, group in enumerate(grouper(f, 8)):
        with open(f'out_{i}.txt', 'w') as outf:
            outf.write(''.join(group).replace('\n', ' ') + '\n')

使用生成器风格做事的好处是您可以更改分组规则而无需更改其余代码。例如,如果您想在与日期格式匹配的每一行上进行拆分,如Miguel Ortiz 的回答

from itertools import groupby

rdate = re.compile(r'(\d+/\d+/\d+)')
with open(path) as f:
    for i, (k, group) in enumerate(groupby(f, rdate.search)):
        with open(f'out_{i}.txt', 'w') as outf:
            outf.write(''.join(group).replace('\n', ' ') + '\n')

推荐阅读