2012-02-23 63 views
3

這是我創建的一個測試,用於重新創建我在使用 tempfile.NamedTemporaryFile()時遇到的問題。問題是,當我使用tempfile時,我的CSV中的 數據被截斷了文件的末尾。爲什麼tempfile.NamedTemporaryFile()會截斷我的數據?

當您運行此測試腳本時,temp2.​​csv將被截斷並且temp1.csv 將與原始CSV的大小相同。

我正在使用Python 2.7.1。

您可以從http://explore.data.gov/Energy-and-Utilities/Residential-Energy-Consumption-Survey-RECS-Files-A/eypy-jxs2

#!/usr/bin/env python 

import tempfile 
import shutil 


def main(): 
    f = open('RECS05alldata.csv') 
    data = f.read() 
    f.close() 

    f = open('temp1.csv', 'w+b') 
    f.write(data) 
    f.close() 

    temp = tempfile.NamedTemporaryFile() 
    temp.write(data) 
    shutil.copy(temp.name, 'temp2.csv') 
    temp.close() 

if __name__ == '__main__': 
    main() 

回答

8

添加後temp.write(數據)temp.flush()。

+1

工作,但似乎有點違反直覺。看起來temp.flush()應該放在temp.write(data)之前。這是我之前嘗試過的,它不起作用。我希望我能更好地理解爲什麼它在write()之後工作。 – Brent 2012-02-25 00:19:56

1

下載示例CSV關閉它之前您複製文件。文件被緩衝,這意味着它的一部分會在等待被寫入文件時保留在緩衝區中。作爲文件關閉的一部分,close將把所有剩餘數據從緩衝區寫出到文件中。

這與NamedTemporaryFile無關。

+0

或[flush()](http://docs.python.org/library/stdtypes.html#file.flush)如果您不希望文件被關閉,但希望寫入數據出。 – 2012-02-23 22:40:14

+0

@BrendanLong,你通常不想複製文件,直到你完成它 - 但你的觀點是有效的。 – 2012-02-23 22:47:31

+0

Python 2.6+具有此方法的'delete = True'參數,「如果刪除爲真(默認),則文件一旦關閉就會被刪除」 如果您認爲此行爲相同,則可能會造成混淆(')'方法,並在複製它之前本能地'關閉''NamedTemporaryFile',因爲它會消失,並且副本將會出錯。 flush()是這裏的解決方案。 – Davos 2017-09-24 15:08:31

0

我認爲你的問題是Python在調用shutil.copy時沒有將整個文件刷新到磁盤。

變化

temp = tempfile.NamedTemporaryFile() 
temp.write(data) 
shutil.copy(temp.name, 'temp2.csv') 
temp.close() 

temp = tempfile.NamedTemporaryFile() 
temp.write(data) 
temp.close() 
shutil.copy(temp.name, 'temp2.csv') 
+0

這不適用於Python2.6 +,請參閱'delete'參數https://docs.python.org/2/library/tempfile.html#tempfile.NamedTemporaryFile – Davos 2017-09-24 15:10:14

相關問題