2016-02-09 3 views
1

Я пытаюсь отредактировать файл CSV, используя информацию из первого. Мне это не кажется простым, поскольку я должен фильтровать несколько вещей. Давайте объясним мою проблему.Исправлены ошибки в программе python, связанной с CSV

У меня есть два CSV-файла, скажем patch.csv и origin.csv. Выходной файл csv должен иметь тот же шаблон, что и origin.csv, но с исправленными значениями.

Я хочу заменить trip_headsign полей столбцов в origin.csv используя forward_line_name колонку в patch.csv если direction_id поле в origin.csv строке 0, или с помощью backward_line_name если direction_id равен 1.

Я хочу, чтобы это сделать только если часть значения line_id в patch.csv между символами «:» и «:» совпадает с частью значения route_id в origin.csv перед символом «:».

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

Вот образец origin.csv:

route_id,service_id,trip_id,trip_headsign,direction_id,block_id 

210210109:001,2913,70405957139549,70405957,0, 
210210109:001,2916,70405961139553,70405961,1, 

и образец patch.csv:

line_id,line_code,line_name,forward_line_name,forward_direction,backward_line_name,backward_direction,line_color,line_sort,network_id,commercial_mode_id,contributor_id,geometry_id,line_opening_time,line_closing_time 

OIF:100110010:10OIF439,10,Boulogne Pont de Saint-Cloud - Gare d'Austerlitz,BOULOGNE/PONT DE ST CLOUD - GARE D'AUSTERLITZ,OIF:SA:8754700,GARE D'AUSTERLITZ - BOULOGNE/PONT DE ST CLOUD,OIF:SA:59400,DFB039,91,OIF:439,metro,OIF,geometry:line:100110010:10,05:30:00,25:47:00 
OIF:210210109:001OIF30,001,FFOURCHES LONGUEVILLE PROVINS,Place Mérot - GARE DE LONGUEVILLE,,GARE DE LONGUEVILLE - Place Mérot,OIF:SA:63:49,000000 1,OIF:30,bus,OIF,,05:39:00,19:50:00 

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

На основе mhopeng ответа на предыдущий вопрос, я получил этот код:

#!/usr/bin/env python2 
from __future__ import print_function 
import fileinput 
import sys 

# first get the route info from patch.csv 
f = open(sys.argv[1]) 
d = open(sys.argv[2]) 
# ignore header line 
#line1 = f.readline() 
#line2 = d.readline() 
# get line of data 
for line1 in f.readline(): 
    line1 = f.readline().split(',') 
    route_id = line1[0].split(':')[1] # '210210109' 
    route_forward = line1[3] 
    route_backward = line1[5] 
    line_code = line1[1] 

# process origin.csv and replace lines in-place 
    for line in fileinput.input(sys.argv[2], inplace=1): 
     line2 = d.readline().split(',') 
     num_route = line2[0].split(':')[0] 
# prevent lines with same route_id but different line_code to be considered as the same line  
     if line.startswith(route_id) and (num_route == line_code): 
     if line.startswith(route_id): 
      newline = line.split(',') 
      if newline[4] == 0: 
       newline[3] = route_backward 
      else: 
       newline[3] = route_forward 
      print('\t'.join(newline),end="") 
     else: 
      print(line,end="") 

Но, к сожалению, это не нажать правую вперед или backward_line_name в trip_headsign (всегда вперед используется), условие для сравните patch.csv line_code до конца route_id из origin.csv (после «:») не работает, и скрипт, наконец, вызывает эту ошибку, прежде чем заканчивать разбор файла:

Traceback (последний звонок последний): Файл «./GTFS_enhancer_headsigns.py», строка 28, в , если новая строка [4] == 0: IndexError: список указателей за пределами допустимого диапазона

Не могли бы вы помочь мне устранить эти три проблемы?

Спасибо за вашу помощь :)

ответ

0

Вы действительно должны рассмотреть возможность использования питона csv module вместо split().

Из-за опыта все гораздо проще при работе с CSV-файлами и модулем csv.

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

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