2016-08-18 64 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块具有额外的好处,即即使引发异常并且不执行以下代码,文件也会关闭。