我有一个名为test.csv
的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
,但显然附加模式不会跳过现有文件的最后一行。
答案 0 :(得分:3)
您使用的是pandas套餐吗?你没有在任何地方提到过。
Pandas不会自动添加新行,我不知道如何强制它。但你可以这样做:
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
块具有额外的优势,即即使引发异常并且未执行以下代码,文件也会关闭。