2015-06-19 2 views
-1

У меня есть файл FILE.CSV с некоторыми данными:Python CSV в словарь с первой строкой в ​​качестве заголовка

fn,ln,tel 
john,doe,023322 
jul,dap,024322 
jab,sac,0485 

Я хотел бы иметь массив, который я могу получить доступ, как это:

file = 'file.csv' 
with open(file,'rU') as f: 
    reader = csv.DictReader(f) 

print reader[0].fn 

Поэтому я бы хотел, чтобы он печатал первое имя из первой записи. К сожалению, я получаю эту ошибку:

ValueError: I/O operation on closed file 

Как я могу сделать это так, что мне не нужно, чтобы сохранить файл открыт, и что я могу играть с моим массивом. Кстати, мне не нужно записывать обратно в CSV-файл, мне просто нужно использовать данные, и для этого лучше всего использовать массив, который я могу изменить.

+0

Какой выходной сигнал вы хотите иметь или массив? Также ваша ошибка неправильная для вашего кода –

+0

Обратите внимание, что 'reader [0]' не будет работать в или из инструкции 'with'. Вы получите 'AttributeError', потому что объект' reader' не имеет метода '__getitem__'. Кроме того, строки 'DictReader' являются обычными словарями, поэтому' row.fn' не работает, вы должны использовать 'row ['fn']'. Вы кое-что упростили здесь. –

ответ

4

Вы должны получить доступ к читателю * в with блоке, а не за его пределами:

file = 'file.csv' 
with open(file,'rU') as f: 
    reader = csv.DictReader(f) 
    first_row = next(reader) 
    print first_row['fn'] 

Как только вы перемещаете код вне блока, объект f файл закрыт и вы не можете получить строк от читателя. Это своего рода точка в заявлении with.

Если вы хотите иметь произвольный доступ ко всем строкам в файле, преобразовать читатель в список первым:

file = 'file.csv' 
with open(file,'rU') as f: 
    reader = csv.DictReader(f) 
    all_rows = list(reader) 

print all_rows[0]['fn'] 

list() вызова перебрать reader, добавляя каждый результат поддался список объектов пока все строки не будут прочитаны. Убедитесь, что у вас достаточно памяти для хранения всех этих строк.

+0

У меня есть это, но как я могу это сделать, чтобы сохранить его снаружи? Мне нужно использовать это в разных функциях. – Richard

+0

@ Рихард: уже обновлен. :-) –

+0

Как woud 'reader [0] .fn' вызывает ошибку ввода-вывода? –

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