【问题标题】:how to append to a new row when writing to CSV file [duplicate]写入CSV文件时如何附加到新行[重复]
【发布时间】:2016-06-27 09:48:23
【问题描述】:

我想在写入时追加到 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'])

新的 mycsv 文件:

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

我想要什么:

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

【问题讨论】:

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

标签: python csv


【解决方案1】:

经过一些修改,我意识到您可以添加以下行以确保您开始在 csv 中的新行上书写。虽然它看起来有点骇人听闻。文档中提到了很多关于 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 为什么?如果您使用循环添加多个新行,则无需在该循环中包含空白列表。如果您要手动添加另一个写入器,它仍然可以正常工作,不会产生空行。
  • 我的意思是如果只运行代码两次或更多次,不修改任何内容,就会创建空行。
  • 哦,是的,因为 writerow 方法增加了一行,所以在 2nd+ 运行中不需要新行。不需要在第 2 次以上运行时使用空白的 writerow 列表。似乎该方法打算让 CSV 以新行结束。
【解决方案2】:

问题是您的原始文件没有写入最终换行符。这重现了问题:

#!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 的换行符。

【讨论】:

    【解决方案3】:

    seek(0,2) 表示转到文件的结束位置。

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

    【讨论】:

      猜你喜欢
      • 2018-11-28
      • 2017-02-04
      • 1970-01-01
      • 2021-11-20
      • 2014-05-10
      • 2019-10-17
      • 2018-05-24
      • 2018-08-09
      • 1970-01-01
      相关资源
      最近更新 更多