我必须创建一个函数,查找文件的ID列(因为它可以在头的任何地方索引),一旦找到ID列将检查给定的ID是否等于列中的任何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
和三个测试用例是:
data = get_data("file1.csv")
edata = ecu_data('153', data)
print(edata[0])
data = get_data("file1.csv")
edata = ecu_data('153', data)
print(edata[22])
data = get_data("file3.csv")
edata = ecu_data('368', data)
print(edata[1])
前两种情况除外&接收输出:['1597759710.1258929', '153', '8', '20 A1 10 FF 00 FF 50 1F', 'Normal', 'Normal']
和['1597759710.345933', '153', '8', '20 A1 10 FF 00 FF C0 8F', 'Normal', 'Normal']
而第三种情况期望输出:['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']
我如何修复我的代码,使行打印他们是如何在他们的文件?
下面的函数接受一个csv文件名和一个要搜索的ID。它将打开文件,然后使用DictReader
将带有头行的每行读入字典。然后,它将返回Arbitration_ID
与search_id
匹配的任何行的values()
(或者通过删除.values()
也可以返回字典)
import csv
def find_rows_by_id(file, search_id):
with open(file) as f:
return [row.values() for row in csv.DictReader(f) if row['Arbitration_ID'] == search_id]
print(find_rows_by_id('file1.csv','153'))
下面的代码片段有一个函数,它可能会帮助你解决你的问题。
解释:
- 这个函数使用'with'语句读取指定文件。
- 现在我们将读取第一行,并使用','(逗号)分隔符将其分开,因为我们有一个CSV文件。strip()函数用于删除由split(',')函数生成的元素中存在的任何空字符或空格。如前所述,ID列可以在头部的任何地方索引,我们将其索引值存储在变量id_index中,并将其用于我们的引用。
- 如果ID列未找到,我们将返回None作为我们的输出。 现在,我们将循环遍历该文件,并使用类似的函数.strip()和.split(',')在每次迭代中存储特定行的实例。
- 现在是最后一部分;我们将使用条件语句并检查符合ID的行实例,最后返回整个行。
代码:
def find_row_by_id(filename, id_to_find):
with open(filename, 'r') as f:
header = f.readline().strip().split(',')
id_index = None
for i, col_name in enumerate(header):
if col_name == 'ID':
id_index = i
break
if id_index is None:
return None
for line in f:
row = line.strip().split(',')
if row[id_index] == id_to_find:
return row
return None