我必须在现有但非常大(2 - 10 GB范围)的文本文件中添加一些任意文本。由于文件太大,我试图避免将整个文件读入内存。但我是否过于保守,逐行迭代?迁移到readlines( sizehint )的方法是否比我目前的方法具有更大的性能优势?
最后的删除和移动不太理想,但据我所知,没有办法对线性数据进行这种操作。但是我对Python并不是那么精通 - 也许我可以利用Python独有的东西来更好地做到这一点?
import os
import shutil
def prependToFile(f, text):
f_temp = generateTempFileName(f)
inFile = open(f, 'r')
outFile = open(f_temp, 'w')
outFile.write('# START\n')
outFile.write('%s\n' % str(text))
outFile.write('# END\n\n')
for line in inFile:
outFile.write(line)
inFile.close()
outFile.close()
os.remove(f)
shutil.move(f_temp, f)
答案 0 :(得分:2)
如果这是在Windows NTFS上,您可以插入文件的中间。 (或者我告诉我,我不是Windows开发人员)。
如果这是在POSIX(Linux或Unix)系统上,你应该像别人说的那样使用“cat”。使用本书中的每一个技巧来获得最佳性能(即复制缓冲区等等),这是非常有效的。
但是,如果你必须在python中进行,你可以使用shutil.copyfileobj()(需要2个文件句柄)和tempfile.TemporaryFile(创建一个在关闭时自动删除的文件)来改进你提供的代码:
import os
import shutil
import tempfile
def prependToFile(f, text):
outFile = tempfile.NamedTemporaryFile(dir='.', delete=False)
outFile.write('# START\n')
outFile.write('%s\n' % str(text))
outFile.write('# END\n\n')
shutil.copyfileobj(file(f, 'r'), outFile)
os.remove(f)
shutil.move(outFile.name, f)
outFile.close()
我认为不需要os.remove(f),因为shutil.move()将删除f。但是,你应该测试一下。此外,可能不需要“delete = False”,但可以安全地离开它。
答案 1 :(得分:1)
您可以使用更适合作业的工具os.system("cat file1 file2 > file3")
答案 2 :(得分:1)
您要做的是大量读取文件(从64k到几MB),然后写出块。换句话说,使用巨大的块代替单独的线。这样你就可以实现最少的I / O,并希望你的进程是I / O绑定而不是CPU绑定。
答案 3 :(得分:0)
老实说,如果您担心执行时间,我建议您在C中写一下。从Python进行系统调用可能会非常慢,并且因为无论你是逐行还是原始块读取方法,你都必须对它们进行批次,这样才能真正拖延