Подтвердить что ты не робот

Как пропустить предварительные строки заголовка с помощью csv.DictReader?

Я хочу csv.DictReader вывести имена полей из файла. Документы говорят: "Если параметр fieldnames опущен, значения в первой строке csvfile будут использоваться как имена полей.", но в моем случае первая строка содержит заголовок и вторую строку, которая содержит имена.

Я не могу применить next(reader) в соответствии с Python 3.2 пропустить строку в csv.DictReader, поскольку присвоение имени поля происходит при инициализации читателя (или я ' m делать это неправильно).

Csvfile (экспортируется из Excel 2010, исходный источник):

CanVec v1.1.0,,,,,,,,,^M
Entity,Attributes combination,"Specification Code
Point","Specification Code
Line","Specification Code
Area",Generic Code,Theme,"GML - Entity name
Shape - File name
Point","GML - Entity name
Shape - File name
Line","GML - Entity name
Shape - File name
Area"^M
Amusement park,Amusement park,,,2260012,2260009,LX,,,LX_2260009_2^M
Auto wrecker,Auto wrecker,,,2360012,2360009,IC,,,IC_2360009_2^M

Мой код:

f = open(entities_table,'rb')
try:
    dialect = csv.Sniffer().sniff(f.read(1024))
    f.seek(0)

    reader = csv.DictReader(f, dialect=dialect)
    print 'I think the field names are:\n%s\n' % (reader.fieldnames)

    i = 0
    for row in reader:
        if i < 20:
            print row
            i = i + 1

finally:
    f.close()

Текущие результаты:

I think the field names are:
['CanVec v1.1.0', '', '', '', '', '', '', '', '', '']

Желаемый результат:

I think the field names are:
['Entity','Attributes combination','"Specification Code Point"',...snip]

Я понимаю, что было бы целесообразно просто удалить первую строку и продолжить, но я пытаюсь приблизиться к простому чтению данных на месте, насколько могу, и минимизировать ручное вмешательство.

4b9b3361

Ответ 1

Я использовал islice из itertools. Мой заголовок был в последней строке большой преамбулы. Я передал преамбулу и использовал hederline для имен полей:

with open(file, "r") as f:
    '''Pass preamble'''
    n = 0
    for line in f.readlines():
        n += 1
        if 'same_field_name' in line: # line with field names was found
            h = line.split(',')
            break
    f.close()
    f = islice(open(i, "r"), n, None)

    reader = csv.DictReader(f, fieldnames = h)

Ответ 2

После f.seek(0) вставить:

next(f)

чтобы переместить указатель файла во вторую строку перед инициализацией DictReader.