2015-03-21 5 views
1

В Python (2.7.6) Я пытаюсь получить списки из некоторых столбцов файла CSV. Учитывая CSV файл test.csv с содержанием:не удалось выполнить итерацию через csv DictReader более одного раза

COL_ONE,COL_TWO,COL_THREE 
val_R1C1,val_R1C2,val_R1C3 
val_R2C1,val_R2C2,val_R2C3 
val_R3C1,val_R3C2,val_R3C3 
val_R4C1,val_R4C2,val_R4C3 

я ожидаю следующий код, чтобы сделать это для меня:

import csv 

reader = csv.DictReader(open("test.csv", "r")) 
col2 = list(c2['COL_TWO'] for c2 in reader) 
col3 = list(c3['COL_THREE'] for c3 in reader) 

К сожалению, когда я печатаю эти два списка, col2 и col3, второй список пусто.

['val_R1C2', 'val_R2C2', 'val_R3C2', 'val_R4C2'] 
[] 

Эта альтернатива имеет один и тот же результат:

reader = csv.DictReader(open("test.csv", "r")) 
col2 = [] 
for c2 in reader: 
    col2.append(c2['COL_TWO']) 
col3 = [] 
for c3 in reader: 
    col3.append(c3['COL_THREE']) 

Обходной легко:

col2 = [] 
col3 = [] 
for cval in reader: 
    col2.append(cval['COL_TWO']) 
    col3.append(cval['COL_THREE']) 

я получаю то, что я ожидал бы в двух предыдущих примерах:

['val_R1C2', 'val_R2C2', 'val_R3C2', 'val_R4C2'] 
['val_R1C3', 'val_R2C3', 'val_R3C3', 'val_R4C3'] 

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

+2

http://stackoverflow.com/questions/431752/python-csv-reader-how-do-i-return-to- the-top-of-the-file –

ответ

0

перемотка назад основной файл в положение 0 между гласит:

import csv 

fh = open("test.csv", "r") 
reader = csv.DictReader(fh) 
next(reader) # skip header row 
col2 = list(c2['COL_TWO'] for c2 in reader) 
fh.seek(0) ## <------------------- this is the point 
next(reader) # skip header row 
col3 = list(c3['COL_THREE'] for c3 in reader) 
+0

Когда я запускаю этот код, а затем печатаю col2 и col3, я получаю: 10 [0] val_R1C3 ',' val_R2C3 ',' val_R3C3 ',' val_R4C3 '] – ChurlishPedant

+0

Вы не показываете хотя бы часть кода, в котором вы пропускаете первую строку файла; Я собираюсь изменить свой ответ, чтобы обеспечить это, но, пожалуйста, загляните в свой код, где это происходит ... – logc

+0

logc, спасибо за ваши объяснения. Фактически, код, который я показал, завершен, за исключением двух операторов печати в конце. Код, который вы показываете, дает мне «[val_R2C2», «val_R3C2», «val_R4C2») '' ['val_R1C3', 'val_R2C3', 'val_R3C3', 'val_R4C3'] 'Если я удалю первый' следующий' Я получаю желаемый результат. – ChurlishPedant

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