to_csv 追加模式不追加到下一个新行

to_csv append mode is not appending to next new line

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

您使用的是 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()

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

您不会关闭在 with 块中打开的文件。使用 with 块还有一个额外的好处,即即使引发异常并且不执行以下代码,文件也会关闭。