python中csv reader对象未识别csvreader.fieldnames属性

8 投票
4 回答
18063 浏览
提问于 2025-04-16 05:34

我正在尝试用Python的CSV模块提取一个CSV文件的表头。

这个CSV文件结构很简单,大概长这样:

这个, 那个, 其他

1, 2, 3

我做的步骤如下:

  1. 读取CSV文件,并创建一个读取对象
  2. 让读取器的迭代器跳到下一行,强制它至少访问第一行一次(根据CSV模块的文档:“如果在创建对象时没有作为参数传入,这个属性会在第一次访问时初始化,或者在从文件读取第一条记录时初始化。”)
  3. .fieldnames属性赋值给一个变量,然后打印出来

这里有一段代码来说明:

datafile = open(fname, "rb")
reader = csv.reader(datafile) #use csv module to parse in the header
reader.next() # read next line so header will be accessed
rfd_header = reader.fieldnames

print "header:\n"
print rfd_header

结果却出现了一个错误:

AttributeError: '_csv.reader'对象没有'fieldnames'属性

这听起来像是.fieldnames属性不存在,但在Python 2.6.6的文档中是有的(我用的就是这个版本的Python)

如果有人能帮我解开这个谜团,我会非常感激。如果有其他方法可以提取表头,那就更好了!

谢谢。

4 个回答

0

如果你需要把结果放在一个列表里,可以这样做:

rfd_header = reader.next()

这段代码会把第一行(也就是表头/字段)存到一个叫“rfd_header”的变量里。

接下来,你可以遍历这个变量里的值,把它们放进一个列表里。

headerList = []
for item in rfd_header:
    headerList.append(item)

最后,你可以把结果打印出来。

print headerList
6

试试用 csv.DictReader,而不是 csv.reader。文档里也提到了这一点:

DictReader 对象有一个公共属性:

csvreader.fieldnames - 如果在创建对象时没有作为参数传入,这个属性会在第一次访问时初始化,或者在从文件读取第一条记录时初始化。

http://docs.python.org/library/csv.html

11

如果你真的想用csv.reader而不是csv.DictReader,你只需要把

reader.next() # read next line so header will be accessed
rfd_header = reader.fieldnames

替换成

rfd_header = reader.next()

撰写回答