<p>您可以从原件中取出第二行并用新行压缩它们,然后重新打开原件并写入更新的行,假定新行等于原件长度的一半:</p>
<pre><code>from itertools import izip
with open("new.txt") as f,open("orig.txt") as f2:
lines = f2.readlines()
zipped = izip(lines[::2],f) # just use zip for python3
with open("orig.txt","w") as out:
for pair in zipped:
out.writelines(pair)
</code></pre>
<p>如果要根据第二列对行进行排序,还需要手动剥离并插入换行符,以便将最后的行分开:</p>
<pre><code>from itertools import izip,islice
with open("new.txt") as f, open("orig.txt") as f2:
orig = sorted((x.strip() for x in islice(f2, 0, None, 2)), key=lambda x: int(x.split(None, 2)[1]))
new = sorted((x.strip() for x in f), key=lambda x:int(x.split(None,2)[1]))
zipped = izip(orig, new)
with open("orig.txt","w") as out:
for pair in zipped:
out.write("{}\n{}\n".format(*pair))
</code></pre>
<p>输出:</p>
<pre><code>CROD 850 123456 123457 123458 123459
PROD 850 30003 0.096043
CROD 851 123456 123457 123458 123459
PROD 851 30003 0.096043
CROD 852 123456 123457 123458 123459
PROD 852 30003 0.096043
CROD 853 123456 123457 123458 123459
PROD 853 30003 0.096043
</code></pre>
<p>如果长度不相同,则可以使用<a href="https://docs.python.org/2/library/itertools.html#itertools.izip_longest" rel="nofollow">itertools.izip_longest</a>,fillvalue为<code>""</code>,这样就不会丢失任何数据:</p>
<p>如果旧文件已经按顺序排列,只需忘记f2上的排序调用并使用<code>f2.readlines()[::2]</code>,但如果它不按顺序排列,则这将确保所有行都按第二列排序,而不管原始顺序如何。你知道吗</p>