擅长:python、mysql、java
<p>天真的解决方案:</p>
<pre><code>from itertools import groupby
with open('data.txt') as f:
for key, group in groupby(f, lambda s: s.startswith('>')):
print(''.join(s.rstrip('\n') for s in group))
</code></pre>
<p>只有当以<code>></code>开头的行都是单行时,这才起作用,它们在您的示例中都是单行。为了避免将这些连接起来,您可以执行以下操作:</p>
<pre><code>from itertools import groupby, count
counter = count()
with open('data.txt') as f:
for key, group in groupby(f, lambda s: next(counter) if s.startswith('>') else -1):
print(''.join(s.rstrip('\n') for s in group))
</code></pre>
<p>关键是<code>groupby</code>:<code>count()</code>的键函数是一个生成器,它只生成一个整数序列0,1,2。这意味着每个<code>></code>行都有自己的唯一键,而所有其他行都有一个<code>-1</code>键,并且除了<code>></code>行介入时,它们被组合在一起。</p>
<p>实际上,任何保持组唯一的表达式都可以使用,不必是计数器。例如,您可以使用:</p>
<pre><code>lambda s: object() if s.startswith('>') else None
</code></pre>
<p>文件迭代和<code>groupby</code>都是惰性的,因此组将在读取组后的行中立即输出。</p>