擅长:python、mysql、java
<p>有限大小的<code>deque</code>是保留最后几行的“环形缓冲区”的好方法:</p>
<pre><code>import collections
lastfewlines = collections.deque((), 4)
with open('SFU.txt') as f:
for line in f:
if 'configuration' in line and len(lastfewlines) == 4:
print(lastfewlines[0])
lastfewlines.append(line.rstrip())
</code></pre>
<p>然而,虽然这解决了问题中提出的问题,但它并不适用于OP只在注释中提到的“真正的问题”——“编辑”那一行,这意味着,大概是将输入文件“就地”修改。在</p>
<p>唉,现代文件系统不允许对文件进行“就地编辑”,但逐字节覆盖除外——除非“编辑”的行与原始行的字节数完全相同,否则不能只覆盖原来的行,并想象文件中的所有后续行都将按需来回移动!-)在</p>
<p>相反,你必须读文件,修改它,然后重写它(最合理的方法通常是编写一个新文件,然后将其重命名为旧文件名,“尽你的操作系统和文件系统允许的那样自动”,以避免在发生崩溃时丢失数据)。在</p>
<p><code>deque</code>方法可以适应这种情况——而不是有条件地打印<code>lastfewlines[0]</code>,而是将其原始或修改后的版本写入输出文件(最后将{<cd1>}中剩下的内容写入输出文件)。然后,至少在Unix系统和本地文件系统上,一个简单的<code>os.rename</code>就能完成原子技巧(只要输出文件与输入文件在同一个挂载磁盘上)。在</p>
<p>然而,对于所有的文件,除了非常大的文件外,读取内存中的所有行(使用<code>f.readlines()</code>),执行行列表上的任何更改,然后再次写出批,就简单多了。如果用户在文件中提到的每行字节数都小于16000个字节的大小,那么就不必担心文件的大小了!-)在</p>