首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >纠正python程序处理CSV的错误

纠正python程序处理CSV的错误
EN

Stack Overflow用户
提问于 2016-02-09 08:55:32
回答 1查看 60关注 0票数 1

我试图用第一个文件中的信息编辑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的一个示例:

代码语言:javascript
运行
复制
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的样本:

代码语言:javascript
运行
复制
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对前面问题的回答,我得到了以下代码:

代码语言:javascript
运行
复制
#!/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索引超出范围

你能帮我解决这三个问题吗?

(谢谢你的帮助:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-09 09:07:38

您确实应该考虑使用python csv模块而不是split()

没有经验,当使用csv文件和csv模块时,一切都要简单得多。

通过这种方式,您可以以结构化的方式遍历数据集,而不会导致索引超出范围错误的风险。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35287631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档