<p>通过替换文件中指定行的长度来修改该行。在</p>
<p>在这个演示中,我使用<code>#</code>作为替换字符,以便更容易看到发生了什么。您可以使用一个简单的空格(<code>chr(32)</code>),或者使用ascidel字符(<code>chr(127)</code>==<code>\x7f</code>)。使用DEL的一个好处是它使快速删除所有这些“已删除”的行变得更容易一些,因为该字符不会出现在文件的任何“正确”行中。在</p>
<p>首先,这里有一个小的文本文件来测试这段代码。在</p>
<p><strong>q数据</strong></p>
<pre><code>1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine
</code></pre>
<p>这是密码。请注意,它使用基于1的行号。在</p>
^{pr2}$
<p>以下是qdata的修改版本:</p>
<pre><code>1 one
2 two
#######
4 four
5 five
6 six
7 seven
8 eight
9 nine
</code></pre>
<p>因为它必须处理不同长度的行,<code>erase_line</code>必须读取所有行,直到找到所需的行,但它只重写该行,它不会修改任何其他行,因此它应该相当快。如果您的行是固定长度的,我们可以使用<code>.skip</code>立即跳转到所需的行。在</p>
<hr/>
<p>这里有一个函数,它将删除所有完全由DEL字符组成的行,并将结果写入一个新文件。在</p>
<pre><code>def compact(oldname, newname):
''' Copy file `oldname` to `newname`, removing lines that
consist entirely of the DEL char, apart from the '\n'
'''
DEL = '#'
with open(oldname, 'r') as fin, open(newname, 'w') as fout:
for line in fin:
if not line.lstrip(DEL) == '\n':
fout.write(line)
compact('qdata', 'qdata.new')
</code></pre>
<p><strong>qdata.new</strong></p>
<pre><code>1 one
2 two
4 four
5 five
6 six
7 seven
8 eight
9 nine
</code></pre>
<p>最后,这里是一个执行压缩操作的Unix/Linux管道,假设您使用的是实际的DEL字符(八进制中的<code>\177</code>)。它可能比我的Python版本快。在</p>
<pre><code>tr -d '\177' <qdata | awk '!/^$/' >qdata.new
</code></pre>