通过将标题与多个字典键值匹配,从CSV中获取行



我有一个带有头的CSV文件,我想从CSV中检索与字典键值匹配的所有行。注意,字典可以包含任意数量的轨道键和值来匹配。

以下是我为解决这个问题而编写的代码,有没有其他更好的方法(除了pandas数据帧(?

更好的方法意味着删除不必要的变量(如果有的话(?与低于解决方案的相比,更好的数据结构、更好的库、降低空间/时间复杂性

options = {'h1': 'v1', 'h2': 'v2'}
output = []
with open("data.csv", "rt") as csvfile:
data = csv.reader(csvfile, delimiter=',', quotechar='"')
header = next(data)
for row in data:
match = 0
for k, v in options.items():
match += 1 if row[header.index(k)] == v else 0
if len(options.keys()) == match:
output.append(dict(zip(header, row)))
return output

你不会说你认为是什么;"更好";也就是说,如果您使用csv.DictReader来处理输入文件,则需要更少的代码行

import csv

def find_matching_rows(filename, criteria, delimiter=',', quotechar='"'):
criteria_values = tuple(criteria.values())
matches = []
with open(filename, 'r', newline='') as csvfile:
for row in csv.DictReader(csvfile, delimiter=delimiter, quotechar=quotechar):
if tuple(row[key] for key in criteria) == criteria_values:
matches.append(row)
return matches

results = find_matching_rows('matchtest.csv', {'h1': 'v1', 'h2': 'v2'})
for row in results:
print(row)

您可以使用列表理解来读取和过滤DictReader的行。将所需的选项设置为一组,然后就可以很容易地测试交集了。

import csv

def test():
options = {'h1': 'v1', 'h2': 'v2'}
wanted = set(options.items())
with open("data.csv", "rt", newline="") as csvfile:
return [row for row in csv.DictReader(csvfile) if set(row.items()) & wanted]
print(test())
print(len(test()))

最新更新