python - 使用 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',这可能更容易,但我不知道如何。
解决方案
查看文档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')
推荐阅读
- python - Pyaudio:如何在单独的进程(多处理)中播放 wav 文件?
- javascript - 如何在 Adobe Embed Api 中打开 pdf 并跳转到特定页面?
- javascript - Selenium 仅加载 JavaScript 而不是完整的 HTML - Python
- node.js - 在循环完成执行之前发生返回
- java - 在spring boot get方法中向响应json添加字段
- javascript - 自定义文本输入在 IOS 中显示自身周围的边框 - React Native
- javascript - 如何使用 ajax 在 laravel php 中使用 checbox 更新多条记录?
- c# - 每种 .NET 语言都有自己的内置库还是遵循 .NET 框架的 BCL(框架基类库)?
- python - 在 selenium python 中使用代理
- javascript - 单击按钮时如何更改标签的 ClassName ?