2015-06-02 7 views
1

У меня есть CSV-файл, l__cyc.csv, который содержит следующее:Как читать несколько записей из файла CSV?

trip_id, time, O_lat, O_lng, D_lat, D_lng 
130041910101,1300,51.5841153671,0.134444590094,51.5718053872,0.134878021928 
130041910102,1335,51.5718053872,0.134878021928,51.5786920389,0.180940040247 
130041910103,1600,51.5786920389,0.180940040247,51.5841153671,0.134444590094 
130043110201,1500,51.5712712038,0.138532882664,51.5334949484,0.130489470325 
130043110202,1730,51.5334949484,0.130489470325,51.5712712038,0.138532882664 

И я пытаюсь вытащить отдельные значения, используя:

with open('./l__cyc.csv', 'rU') as csvfile: 
    reader = csv.DictReader(csvfile) 
    origincoords = ['{O_lat},{O_lng}'.format(**row) for row in reader] 
with open('./l__cyc.csv', 'rU') as csvfile: 
    reader = csv.DictReader(csvfile) 
    trip_id = ['{trip_id}'.format(**row) for row in reader] 
with open('./l__cyc.csv', 'rU') as csvfile: 
    reader = csv.DictReader(csvfile) 
    destinationcoords = ['{D_lat},{D_lng}'.format(**row) for row in reader] 

Где origincoords должен быть 51.5841153671, 0.134444590094,
trip_id должен be 130041910101 и destinationcoords должно быть
51.5718053872, 0.134878021928.

Однако я получаю KeyError:

KeyError: 'O_lat' 

Является ли это что-то простое и есть что-то фундаментальное я недоразумение?

ответ

2

Вы просто избежать пространств между заголовками

trip_id,time,O_lat,O_lng,D_lat,D_lng 

ИЛИ

reader = csv.DictReader(csvfile, skipinitialspace=True) 
+0

К сожалению, нет. Ошибка сохраняется – LearningSlowly

+1

обновлено, проверьте это – itzMEonTV

+1

Работает для меня. Обратите внимание, что после D_lng не должно быть и конечного пространства. Код, вставленный выше (в вопросе), имеет пробел после D_lng. – GreenAsJade

2

Первых вещами первым, вы получите ошибку клавишной, потому что ключ не существует в словаре.

Далее, я бы посоветовал не запускать файл 3 раза, когда вы можете сделать это один раз!

Для меня это сработало, когда я добавил поля к читателю.

import csv 
from cStringIO import StringIO 

src = """trip_id, time, O_lat, O_lng, D_lat, D_lng 
130041910101,1300,51.5841153671,0.134444590094,51.5718053872,0.134878021928 
130041910102,1335,51.5718053872,0.134878021928,51.5786920389,0.180940040247 
130041910103,1600,51.5786920389,0.180940040247,51.5841153671,0.134444590094 
130043110201,1500,51.5712712038,0.138532882664,51.5334949484,0.130489470325 
130043110202,1730,51.5334949484,0.130489470325,51.5712712038,0.138532882664 
""" 
f = StringIO(src) 

# determine the fieldnames 
fieldnames= "trip_id,time,O_lat,O_lng,D_lat,D_lng".split(",") 

# read the file 
reader = csv.DictReader(f, fieldnames=fieldnames) 

# storage 
origincoords = [] 
trip_id = [] 
destinationcoords = [] 

# iterate the rows 
for row in reader: 
    origincoords.append('{O_lat},{O_lng}'.format(**row)) 
    trip_id.append('{trip_id}'.format(**row)) 
    destinationcoords.append('{D_lat},{D_lng}'.format(**row)) 

# pop the header off the list 
origincoords.pop(0) 
trip_id.pop(0) 
destinationcoords.pop(0) 

# show the result 
print origincoords 
print trip_id 
print destinationcoords 

Я действительно не знаю, что вы пытаетесь достичь, но я уверен, что есть лучший способ сделать это!

+0

Спасибо @enpenax. Вы правы, три итерации не нужны. Большое спасибо за ваш код и полезные комментарии. Я изучаю ;) – LearningSlowly