Python CSV DictReader/Writer 问题
我正在尝试从一个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 个回答
1
关于这个异常,看起来这一行:
w = csv.DictWriter(united, fieldnames=fieldnames)
应该改成
w = csv.DictWriter(target, fieldnames=fieldnames)
13
为了澄清这个错误的原因:你会遇到这个错误是因为 r.fieldnames
只有在你第一次从输入文件读取数据时才会被设置。因此,按照你现在的写法,fieldnames
总是会被初始化为 None
。
你需要在从 r
读取第一行数据后,才能用 r.fieldnames
来初始化 w = csv.DictWriter(united, fieldnames=fieldnames)
,这意味着你需要重新组织你的代码。
这种行为在 Python标准库文档 中有说明。
DictReader 对象有以下公共属性:
csvreader.fieldnames
如果在创建对象时没有作为参数传入,这个属性会在第一次访问时或读取文件中的第一条记录时被初始化。
14
我也不知道,不过既然你只是把一行行的内容从一个文件复制到另一个文件,那为什么还要搞那么复杂的csv
格式呢?不如直接用简单点的方法,比如:
f = open("my_csv_file.csv", "r")
target = open("united.csv", 'w')
f.readline()
f.readline()
for line in f:
target.write(line)