Python CSV DictReader/Writer 问题

3 投票
4 回答
15386 浏览
提问于 2025-04-15 13:15

我正在尝试从一个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)

撰写回答