Я пытаюсь отредактировать файл 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: список указателей за пределами допустимого диапазона
Не могли бы вы помочь мне устранить эти три проблемы?
Спасибо за вашу помощь :)