如何在写入CSV文件时追加到新行

11

我想在写入CSV文件时将内容添加到新行中。当前的CSV文件如下:

a,b,c
1,1,1

我的代码用于将内容附加到CSV文件:

with open('mycsvfile.csv','a') as f:
    writer=csv.writer(f)
    writer.writerow(['0','0','0'])

新的 mycsvfile:

a,b,c
1,1,1,0,0,0

我想要什么:

a,b,c
1,1,1
0,0,0

只是一个提示。如果您使用jxn的原始代码创建一个新的csv文件并追加到其中,它可以正常工作。JNX的问题在于,当他们打开文件以追加['0','0','0']时,文件末尾缺少换行符。 - Framester
3个回答

10

通过一些尝试,我发现您可以添加以下行以确保在csv中开始写入新行。虽然这似乎有点hackish, 但文档提到了很多关于kwarg newline =''的内容,但它没有被识别为有效。

writer.writerow([])

我也使用 'ab' 参数打开。

import csv
with open('mycsvfile.csv','ab') as f:
    writer=csv.writer(f)
    writer.writerow([])
    writer.writerow(['0','0','0'])

如果您运行代码两次并尝试写入两行,就会出现问题。会创建额外的空白行。 - Yunhe
@Yunhe 为什么?如果您使用循环添加多个新行,则无需在该循环中包含空列表。如果您手动添加另一个 writerow,它仍将正确工作,而不会产生空行。 - Chasevanb
我的意思是,如果只是运行代码两次或更多次,而不进行任何修改,就会创建空白行。 - Yunhe
哦,是的,因为writerow方法会添加一行,所以在第二次及之后运行时不需要新的换行符。第二次及之后的运行中不需要空的writerow列表。看起来这个方法意图让CSV以一个新行结束。 - Chasevanb

9
问题在于您的原始文件没有写入最后一个换行符。以下是重现此问题的代码:
#!python3
import csv

#initial content
with open('mycsvfile.csv','w') as f:
    f.write('a,b,c\n1,1,1') # NO TRAILING NEWLINE

with open('mycsvfile.csv','a',newline='') as f:
    writer=csv.writer(f)
    writer.writerow([0,0,0])
    writer.writerow([0,0,0])
    writer.writerow([0,0,0])

with open('mycsvfile.csv') as f:
    print(f.read())

输出:

a,b,c
1,1,10,0,0
0,0,0
0,0,0

请确保原始文件已正确生成:

#!python3
import csv

#initial content
with open('mycsvfile.csv','w') as f:
    f.write('a,b,c\n1,1,1\n') # TRAILING NEWLINE

with open('mycsvfile.csv','a',newline='') as f:
    writer=csv.writer(f)
    writer.writerow([0,0,0])
    writer.writerow([0,0,0])
    writer.writerow([0,0,0])

with open('mycsvfile.csv') as f:
    print(f.read())

输出:

a,b,c
1,1,1
0,0,0
0,0,0
0,0,0

你可以通过一些技巧跳到文件末尾并决定是否写入额外的换行符,但最好修复现有的文件生成方式,使其始终写入换行符。最简单的方法是从一开始就使用“csv”模块,因为它将始终在使用“writerow”时添加一个换行符。

1

seek(0,2) 的意思是跳转到文件的末尾位置。

writer = open('mycsvfile.csv','a')
writer.seek(0,2)
writer.writelines("\r")
writer.writelines( (',').join(['0','0','0']))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接