Python CSV DictReader/Writer问题

sat*_*ace 3 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()
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

不完全确定我错了什么.

Dan*_*man 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)
Run Code Online (Sandbox Code Playgroud)


kyn*_*nan 13

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

您可以初始化w = csv.DictWriter(united, fieldnames=fieldnames)r.fieldnames你读从第一行后,才r,这意味着你将不得不调整你的代码.

Python标准库文档中记录了此行为

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

csvreader.fieldnames

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