Python CSV DictReader / Writer问题

时间:2009-07-29 20:32:43

标签: python csv

我正在尝试从CSV文件中提取一堆行并将它们写入另一行,但我遇到了一些问题。

import csv

f = open("my_csv_file.csv", "r")
r = csv.DictReader(f, delimiter=',')
fieldnames = r.fieldnames

target = open("united.csv", 'w')
w = csv.DictWriter(united, fieldnames=fieldnames)

while True:
try:
    row = r.next()
    if r.line_num <= 2: #first two rows don't matter
        continue
    else:
        w.writerow(row)

except StopIteration:
    break

f.close()
target.close()

运行此命令,我收到以下错误:

Traceback (most recent call last):
File "unify.py", line 16, in <module>
    w.writerow(row)
File "C:\Program Files\Python25\lib\csv.py", line 12
    return self.writer.writerow(self._dict_to_list(row
File "C:\Program Files\Python25\lib\csv.py", line 12
    if k not in self.fieldnames:
TypeError: argument of type 'NoneType' is not iterable

不完全确定我的错误。

4 个答案:

答案 0 :(得分:13)

我也不知道,但由于你所做的只是将行从一个文件复制到另一个文件,为什么还要烦扰csv的东西呢?为什么不能这样:

f = open("my_csv_file.csv", "r")
target = open("united.csv", 'w')

f.readline()
f.readline()
for line in f:
    target.write(line)

答案 1 :(得分:13)

要清除对错误的疑惑:你得到它是因为r.fieldnames只有在你第一次使用r读取输入文件时才会设置。因此,您编写它的方式,fieldnames将始终初始化为None

只有在您阅读w = csv.DictWriter(united, fieldnames=fieldnames)的第一行后,才可以使用r.fieldnames初始化r,这意味着您必须重新构建代码。

Python Standard Library documentation

中记录了此行为
  

DictReader对象具有以下公共属性:

     

csvreader.fieldnames

     

如果在创建对象时未作为参数传递,则在首次访问时或从文件中读取第一条记录时初始化此属性。

答案 2 :(得分:1)

至于例外,看起来像这一行:

w = csv.DictWriter(united, fieldnames=fieldnames)

应该是

w = csv.DictWriter(target, fieldnames=fieldnames)

答案 3 :(得分:1)

您收到错误的原因很可能是原始CSV文件(my_csv_file.csv)没有标题行。因此,在构造reader对象时,其fieldnames字段设置为None

当您尝试使用编写器编写行时,它首先检查以确保dict中没有不在其已知字段列表中的键。由于fieldnames设置为None,因此尝试取消引用密钥名称会引发异常。