繁体   English   中英

在Python中将文本有效地放在很大的文本文件之前

[英]Efficiently prepending text to a very large text file in Python

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

如果在Windows NTFS上,则可以插入文件的中间。 (或者,有人告诉我,我不是Windows开发人员)。

如果这是在POSIX(Linux或Unix)系统上,则应使用“ cat”作为其他人所说的。 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”,但可以放心地删除它。

您可以使用更适合作业os.system("cat file1 file2 > file3")工具os.system("cat file1 file2 > file3")

您要做的是读取大文件(从64k到几MB)的文件,然后将其写出。 换句话说,请使用巨大的块而不是单独的行。 这样,您就可以进行最少的I / O,并希望您的进程是I / O绑定的,而不是CPU绑定的。

老实说,如果您担心执行时间,我建议您只用C编写。 从Python进行系统调用可能会非常慢,并且由于必须逐行或原始块读取方法,因此必须执行很多操作,这确实会拖累事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM