在Python中有效地将文本添加到非常大的文本文件中

时间:2011-02-11 02:38:40

标签: python file-io large-files

我必须在现有但非常大(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)

4 个答案:

答案 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进行系统调用可能会非常慢,并且因为无论你是逐行还是原始块读取方法,你都必须对它们进行批次,这样才能真正拖延