2016-11-10 80 views
0

在下面的代碼中,我將創建一個臨時文件,然後在此臨時文件中保存一個txt文件的全部內容。這只是一個例子。我知道讀取文本文件並將其寫入臨時文件是沒有意義的。但我想展示我的問題。Python:read()有更好的方法嗎?

那麼當我使用read()metod,這意味着臨時文件的全部內容保存在RAM內存中,對嗎?我無法控制臨時文件的內容大小。所以我考慮是否有更好的方法來保護RAM內存。我不想淹沒RAM內存。

# Use the TemporaryFile context manager for easy clean-up 
with tempfile.TemporaryFile(delete=True) as tmp: 
    with open('filename.txt', 'r') as my_file: 
     for line in my_file: 
      tmp.write(line) 

    tmp.seek(0) 

    exec(tmp.read()) 
+1

該代碼與文字描述不符。你的實際任務是什麼?你是否想要將一個文本文件作爲Python代碼執行(用代碼中的exec(tmp.read())'來判斷)還是要將一個文本文件的內容逐行復制到另一個文本文件中'代碼中的line in file:output_file.write(line)')。你真正的問題是什麼? – jfs

+0

@ J.F. Sebastian;你是對的。我想將一個文本文件作爲Python代碼執行。在這種情況下,代碼保存在文本文件中。但稍後我會將文本文件保存在Web服務器上。我的程序訪問文本文件,將其保存在臨時文件中,然後執行它。 – Sophus

+1

那麼你爲什麼要擔心RAM?你在微控制器上運行它嗎?有多少內存可用?你不害怕從互聯網上運行任意代碼,但你擔心代碼太多?代碼做了什麼?一次運行一行(具有明確的名稱空間)是否有意義?如果您正在從網絡讀取數據;無論出於何種原因,你可以隨時停止。 – jfs

回答

1

for line in my_file調用文件對象.next其中does not buffer the entire file in memory when reading

爲了使循環在 行的文件中的for循環的最有效方法(一種很常見的操作),下一個()方法使用 隱藏預讀緩衝器

docs

對於從文件中讀取行,您可以遍歷文件對象。這 是存儲器高效,快速,並且導致簡單的代碼

對於tmp.read()功能,從docs

當省略或負大小,文件的全部內容將 是閱讀並返回;這是您的問題,如果該文件是您的機器內存的兩倍大 。

所以,除非你的線,你當你寫呢,還是read爲固定金額遞增tmp.read(100)閱讀,你會讀整個文件到內存中。

+0

恐怕你還沒有理解我的問題,因爲我關注的是read()方法,它嵌套在exec()方法中。看看,在創建的臨時文件被填充之後,我即將使用exec()方法。在這種情況下,我使用read()方法。現在我正在考慮read()方法是否充斥了RAM內存? – Sophus

+0

如果你不想逐行閱讀,你可以隨時閱讀(SomeFixedAmount),直到你閱讀完整個文件,但是如果你需要閱讀,你應該再一行一行地閱讀。 – TheoretiCAL

相關問題