<p>查看文档中<a href="https://docs.python.org/3/library/itertools.html#itertools-recipes" rel="nofollow noreferrer">^{<cd2>} recipes</a>中的<code>grouper</code>:</p>
<pre><code>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)
</code></pre>
<p>现在您可以在每组8行上循环:</p>
<pre><code>with open(path) as f:
for group in grouper(f, 8):
</code></pre>
<p>如果要将每个组合并到一个字符串中,以便写入新文件:</p>
<pre><code>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))
</code></pre>
<p>如果要将所有内部换行符转换为空格:</p>
<pre><code>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')
</code></pre>
<p>生成器样式的好处是,您可以更改分组规则,而无需更改其余代码。例如,如果要在与日期格式匹配的每一行上拆分,如<a href="https://stackoverflow.com/a/50338693/908494">Miguel Ortiz's answer</a>:</p>
<pre><code>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')
</code></pre>