[英]Python CSV DictReader/Writer issues
我试图从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
不完全确定我错了什么。
我也不知道,但是因为你所做的只是将行从一个文件复制到另一个文件,你为什么要烦扰csv
呢? 为什么不是这样的:
f = open("my_csv_file.csv", "r")
target = open("united.csv", 'w')
f.readline()
f.readline()
for line in f:
target.write(line)
为了消除对错误的困惑:你得到它,因为只有在你第一次使用r
读取输入文件时才设置r.fieldnames
。 因此,您编写它的方式, fieldnames
将始终初始化为None
。
只有在从r
读取第一行后,才可以使用r.fieldnames
初始化w = csv.DictWriter(united, fieldnames=fieldnames)
,这意味着您必须重新r.fieldnames
代码。
Python标准库文档中记录了此行为
DictReader对象具有以下公共属性:
csvreader.fieldnames
如果在创建对象时未作为参数传递,则在首次访问时或从文件中读取第一条记录时初始化此属性。
至于异常,看起来像这一行:
w = csv.DictWriter(united, fieldnames=fieldnames)
应该
w = csv.DictWriter(target, fieldnames=fieldnames)
您收到错误的原因很可能是您的原始CSV文件(my_csv_file.csv)没有标题行。 因此,在构造reader对象时,其fieldnames字段设置为None
。
当您尝试使用编写器编写行时,它首先检查以确保dict中没有不在其已知字段列表中的键。 由于fieldnames
设置为None
,因此尝试取消引用密钥名称会引发异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.