2016-08-18 94 views
0

我有一個叫test.csv CSV,看起來像:to_csv追加模式不追加到下一個新行

accuracy threshold trainingLabels 
abc   0.506  15000 
eew   18.12  15000 

然後一個數據幀稱爲summaryDF,看起來像:

accuracy threshold trainingLabels 
def   0.116  342 
dja   0.121  1271 

我做:

try: 
     if os.stat('test.csv').st_size > 0: 
       summaryDF.to_csv(path_or_buf=f, encoding='utf-8', mode='a', header=False) 
       f.close() 
     else: 
      print "empty file" 
      with open('test.csv', 'w+') as f: 
       summaryDF.to_csv(path_or_buf=f, encoding='utf-8') 
       f.close() 
    except OSError: 
     print "No file" 
     with open('test.csv', 'w+') as f: 
      summaryDF.to_csv(path_or_buf=f, encoding='utf-8') 
      f.close() 

因爲我希望我的文件是:

accuracy threshold trainingLabels 
abc   0.506  15000 
eew   18.12  15000 
def   0.116  342 
dja   0.121  1271 

相反,它是:

accuracy threshold trainingLabels 
abc   0.506  15000 
eew   18.12  15000def   0.116  342 
dja   0.121  1271 

我怎樣才能解決這個問題?我猜測使用CSV編寫器而不是to_csv,但顯然追加模式不會跳過現有文件的最後一行。

回答

1

你使用熊貓包嗎?你不會在任何地方提及。

熊貓不會自動附加新行,我不知道如何強制它。但是,你可以這樣做:

f.write('\n') 
summaryDF.to_csv(path_or_buf=f, mode='a', ...) 

在代碼中的錯誤無關:

你似乎有一個全球性的文件對象調用f

當你這樣做:

with open('test.csv', 'w+') as f: 
    ... 
    f.close() 

您關閉那裏,你只是在with塊打開的文件是文件。您沒有關閉全局文件f,因爲該範圍內的變量被f掩蓋。

這是你想要的嗎?無論如何,這是沒有意義的。我們使用with範圍的原因是爲了避免必須顯式關閉文件。

你要麼使用:

f = open('filename') 
... 
f.close() 

OR

with open('filename') as f: 
    ... 

你不關閉with塊中打開的文件。使用with塊具有額外的好處,即即使引發異常並且不執行以下代碼,文件也會關閉。