【问题标题】:Writing rows in a csv using dictionaries in a loop (python 3)在循环中使用字典在 csv 中写入行(python 3)
【发布时间】:2017-03-01 09:10:51
【问题描述】:

我正在通过在循环中添加每一行并使用字典来编写 csv 文件。以下是代码:

fieldnames = ['id', 'variable1', 'variable2']
f = open('file.csv', 'w')   
my_writer = csv.DictWriter(f, fieldnames)
my_writer.writeheader()
f.close()   

for i in something:

    something where I get data for mydict      

    with open('file.csv', 'a+b') as f:
    header = next(csv.reader(f))
    dict_writer = csv.DictWriter(f, header)
    dict_writer.writerow(mydict)

几年前我确信这段代码对我有用,但可能我使用的是 python2。现在我正在使用 python 3,它显示以下错误:

header = next(csv.reader(f))

StopIteration

可能是什么问题?谢谢

【问题讨论】:

  • 旁白:由于您使用的是 Python 3,因此您不应该对文件使用二进制模式。请参阅(例如)here
  • 为什么您不断地重新打开/重新包装文件,而不是创建一次并一遍又一遍地使用它?标题不应该为每一行而改变。即使是这样,只是重新包装比一遍又一遍地重新打开附加更有意义。

标签: python python-3.x csv for-loop dictionary


【解决方案1】:

我的解决方案是:

fieldnames = ['id', 'variable1', 'variable2']

f= open('file.csv', 'w', newline='')
my_writer = csv.DictWriter(f, fieldnames)
my_writer.writeheader()

for i in something:

   something where I get data for mydict   

    writer.writerow(mydict)

f.close()

【讨论】:

  • 这里的设计更没有意义。你的字段名永远不会改变;打开文件once,将其包裹在DictWriteronce中,然后进行所有处理。反复打开和关闭文件并反复将它们包装在一个新的DictWriter 中会更有效率。只要有一个覆盖所有写作的with 块,当循环结束时,它会自动关闭一次。
  • 在同一个循环中,我还创建了另一个单独的 csv 文件,如果我打开一次并进行所有处理会不会有问题?
  • 您可以同时打开多个文件。唯一的问题是,如果您打开两个文件句柄来写入同一个文件(可能一个打开用于读取,一个用于写入也会导致问题,具体取决于使用模式)。但是一次打开两个不同的文件完全没问题。
  • 谢谢,我编辑了我的答案。这是你建议的吗?
  • 除了不使用with 语句来避免绕过close 调用的风险之外,是的,基本上。
猜你喜欢
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 2019-02-19
  • 2017-11-30
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
相关资源
最近更新 更多