to_csv附加模式不会附加到下一个新行

时间:2016-08-18 11:46:08

标签: python csv append export-to-csv

我有一个名为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,但显然附加模式不会跳过现有文件的最后一行。

1 个答案:

答案 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块具有额外的优势,即即使引发异常并且未执行以下代码,文件也会关闭。