首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >高效地将文本前置到Python中的非常大的文本文件中

高效地将文本前置到Python中的非常大的文本文件中
EN

Stack Overflow用户
提问于 2011-02-11 02:38:39
回答 3查看 3.4K关注 0票数 2

我必须将一些任意文本添加到现有的但非常大的(2-10 GB范围)文本文件中。由于文件如此大,我试图避免将整个文件读入内存中。但是,对于逐行迭代,我是不是太保守了?与目前的方法相比,转到读行方法(sign线索)会给我带来很大的性能优势吗?

最后的删除和移动并不理想,但据我所知,没有办法对线性数据进行这种操作。但我不太精通Python --也许Python有什么独特之处,我可以利用它来做得更好吗?

代码语言:javascript
运行
复制
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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-11 02:45:43

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

票数 1
EN

Stack Overflow用户

发布于 2011-04-03 18:53:38

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

如果这是在POSIX (Linux或Unix)系统上,您应该像其他人所说的那样使用"cat“。猫是邪恶的效率,利用书中的每一个技巧,以获得最佳的表现。复制缓冲区等)

但是,如果您必须在python中这样做,则可以通过使用shutil.copyfileobj() (它需要2个文件句柄)和tempfile.TemporaryFile (创建一个在关闭时自动删除的文件)来改进您提供的代码:

代码语言:javascript
运行
复制
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“可能不需要,但可能是安全的离开它。

票数 2
EN

Stack Overflow用户

发布于 2011-02-11 02:42:22

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4965111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档