2013-06-16 1 views
4

я просто интересно, как я могу читать специальное поле из CVS Файл с следующей структурой:Python: Чтение поля CSV-файла со списком списка

40.0070222,116.2968604,2008-10-28,[["route"], ["sublocality","political"]] 
39.9759505,116.3272935,2008-10-29,[["route"], ["establishment"], ["sublocality", "political"]] 

Кстати, что на чтение CVS файлов я использовал для работы с:

with open('routes/stayedStoppoints', 'rb') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=',', quotechar='"') 

проблема с этим состоит в первых 3 полях не проблема я могу использовать:

for row in spamreader: 

строки [0] , строка [1], строка [2], я могу получить доступ без проблем. но в последнем поле, и я думаю, что с csv.reader (csvfile, delimiter = ',', quotechar = '"') также разделялся для каждого подписок:

поэтому, когда я пытался получить доступ, просто покажите мне:

[["route"] 

каждый имеет решение, если последнее поле имеет полный список (список список в самом деле)

[["route"], ["sublocality","political"]] 

для того, чтобы можно получить доступ к каждой категории.

Благодарности

ответ

2

Ваш формат близок к json. Вам нужно всего лишь обернуть каждую строку в скобках и указать даты. Для каждой строки l просто сделать:

lst=json.loads(re.sub('([0-9]+-[0-9]+-[0-9]+)',r'"\1"','[%s]'%(l))) 

приводит lst быть

[40.0070222, 116.2968604, u'2008-10-28', [[u'route'], [u'sublocality', u'political']]] 

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

import json 
import re 

редактировать: вы спросил, как получить доступ к элементу содержащий «маршрут».ответ

lst[3][0][0] 

«политический» находится в

lst[3][1][1] 

Если строки («политические» и другие) может содержать строки ищут как даты, вы должны пойти с решением по @unutbu

+0

Да! на самом деле мое последнее поле - это запрос к местам google, но как получить доступ к первому списку в категориях? я имею в виду, как я могу читать маршрут, чтобы сравнивать с другими? – taonico

2

Использование line.split(',', 3) для split on just the first 3 commas:

import json 
with open(filename, 'rb') as csvfile: 
    for line in csvfile: 
     row = line.split(',', 3) 
     row[3] = json.loads(row[3]) 
     print(row) 

дает

['40.0070222', '116.2968604', '2008-10-28', [[u'route'], [u'sublocality', u'political']]] 
['39.9759505', '116.3272935', '2008-10-29', [[u'route'], [u'establishment'], [u'sublocality', u'political']]] 
2

Это не является допустимым файлом CSV. Модуль csv не сможет прочитать это.

Если структура линии всегда так (два числа, даты, и вложенный список), вы можете сделать это:

import ast 
result = [] 
with open('routes/stayedStoppoints') as infile: 
    for line in infile: 
     coord_x, coord_y, datestr, objstr = line.split(",", 3) 
     result.append([float(coord_x), float(coord_y), 
         datestr, ast.literal_eval(objstr)]) 

Результат:

>>> result 
[[40.0070222, 116.2968604, '2008-10-28', [['route'], ['sublocality', 'political']]], 
[39.9759505, 116.3272935, '2008-10-29', [['route'], ['establishment'], ['sublocality', 'political']]]] 
+0

нормально, но проблема в том, как я могу читать или извлекать каждую категорию или группу категорий для каждой строки! – taonico

+0

@taonico: Что ты имеешь в виду? Они уже были извлечены во вложенный список. Например, используя 'result' сверху,' result [0] [3] [0] [0] 'is' "route" ',' result [0] [3] [1] [1] 'is' " политический «', 'result [1] [3] [1] [0]' is '" creation "и т. д. –

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