簡體   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