如何修复Python函数以原样输出CSV中匹配ID的行
问题:匹配指定Arbitration_ID后返回与文件行序完全一致的结果
需求:实现一个函数,查找文件中位置不固定的Arbitration_ID列,匹配指定ID值后返回对应的行数据,禁止使用任何导入语句。现有代码在处理列顺序不同的文件时,返回的行元素顺序与文件原始行不一致。
现有代码
def ecu_data(arbitration_id, data): """ Returns a list of the timestamp and data of an arbitration_ID. """ rows = [] arb_index = data[0].index("Arbitration_ID") for row in data[0:]: if row[arb_index] == arbitration_id: rows.append(row) return rows
测试用例与问题
前两个测试用例(基于列顺序固定的file1.csv)输出符合预期,但第三个测试用例(基于列顺序不同的file3.csv)出现偏差:
- 预期输出(文件原始行顺序):
['1597759356.234800', '8', '368', '00 00 00 00 00 FA 0A 40', 'Normal', 'Normal'] - 实际输出:
['1597759356.234800', '368', '8', '00 00 00 00 00 FA 0A 40', 'Normal', 'Normal']
解决方案
问题根源是代码可能存在隐式的行元素重排操作(比如之前为了满足注释要求手动按固定顺序组装新列表)。要返回与文件完全一致的行,只需确保直接保留原始行的结构,不对元素顺序做任何调整:
修改后的代码
def ecu_data(arbitration_id, data): """ 返回与文件原始行序一致的指定Arbitration_ID对应的行数据 """ rows = [] # 获取表头中Arbitration_ID的索引 arb_index = data[0].index("Arbitration_ID") # 从第二行开始遍历数据行(跳过表头) for row in data[1:]: if row[arb_index] == arbitration_id: # 直接追加原始行,不修改元素顺序;copy避免外部修改影响返回结果 rows.append(row.copy() if isinstance(row, list) else row) return rows
关键修改点
- 遍历范围调整:将
data[0:]改为data[1:],跳过表头行,符合数据处理逻辑。 - 保留原始行结构:直接追加原始行对象,确保返回的行完全复刻文件中的元素顺序;调用
copy()是为了避免后续外部对原数据的修改影响返回结果。
这样修改后,无论文件中Arbitration_ID列的位置如何变化,返回的行都将与文件中的原始行顺序完全一致。
内容的提问来源于stack exchange,提问作者confusedcoder
相关产品推荐
相关产品推荐

