我试图用第一个文件中的信息编辑CSV文件。这对我来说并不简单,因为我应该过滤多个东西。让我们解释一下我的问题。
我有两个CSV文件,比方说patch.csv和origin.csv。输出csv文件应该具有与origin.csv相同的模式,但具有校正的值。
如果trip_headsign行中的direction_id字段为0,或者如果direction_id为1,则使用patch.csv中的forward_line_name列替换origin.csv中的direction_id列字段。
只有当line_id值在":“和":”符号之间的patch.csv值的部分与":“符号之前的origin.csv中的route_id值部分相同时,我才想这样做。
我知道如何替换整条线,但不只是一些部分,特别是有时我只需要看一部分值。
下面是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 in trip_headsign (总是使用前向),将patch.csv line_code与route_id of origin.csv的末尾(在“:”之后)进行比较的条件不能工作,脚本在解析完文件之前最终触发了该错误:
Traceback (最近一次调用):File“./GTFS_enhancer_ list signs.py”,第28行,if newline4 == 0: IndexError: list索引超出范围
你能帮我解决这三个问题吗?
(谢谢你的帮助:)
发布于 2016-02-09 09:07:38
您确实应该考虑使用python csv模块而不是split()。
没有经验,当使用csv文件和csv模块时,一切都要简单得多。
通过这种方式,您可以以结构化的方式遍历数据集,而不会导致索引超出范围错误的风险。
https://stackoverflow.com/questions/35287631
复制相似问题