2010-10-15 3 views
3

Я пытаюсь извлечь заголовок CSV-файла в Python с помощью модуля CSV.csvreader.fieldnames не распознаются как атрибут объекта чтения csv в python

Файл CSV довольно плоский, и выглядит примерно так:

This, That, The Other

1, 2, 3

я делаю следующее:

  1. Читайте в файле CSV и сделать объект чтения
  2. толкают итератора читателя к следующей строке, чтобы заставить его получить доступ к первой строке хотя бы один раз (из документации модуля csv: «Если это не было передано как параметр при создании объекта, этот атрибут инициализируется при первом доступе или когда первая запись повторяется . D из файла ")
  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' object has no attribute 'fieldnames'

Звучит как атрибут .fieldnames, но нет в документации Python 2.6.6 (такая же версия python я используя)

Буду признателен за понимание этой тайны. Если есть альтернативный метод для извлечения заголовка, который также был бы потрясающим!

Спасибо.

ответ

6

Если вы действительно хотите использовать csv.reader вместо CSV.DictReader, все, что вам нужно сделать, это заменить

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

по

rfd_header = reader.next() 
+0

Спасибо! Это сработало очень хорошо. Я вижу, почему DictReader, вероятно, лучший метод для использования, но для моего приложения мне нужен список. – Jeff

4

Попробуйте csv.DictReader вместо csv.reader. В документации сказано, это тоже:

DictReader объекты имеют следующий общественный атрибут:

csvreader.fieldnames - Если не передается в качестве параметра при создании объекта, то этот атрибут инициализируется при первом обращении, или когда первая запись считывается из файла.

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

+0

Вы совершенно правы, я должен быть неправильно документации: P Я хотел бы использовать DictReader, но так получилось, что мне нужен список. Спасибо за подсказку, хотя! – Jeff

+0

Ум, что означает «этот атрибут инициализируется при первом доступе»? Мне кажется, что класс будет выполнять ленивую инициализацию имен полей в любое время. – MartinP

0

Если вам нужен результат в списке, вы можете взять с собой:

rfd_header = reader.next() 

Это должно сохранить первую строку (заголовок/поля) в переменную «rfd_header»

Затем вы можете перебирать значения переменной и ставить i Nto список

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

Затем вы можете распечатать результат

print headerList 
Смежные вопросы