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

Python 通过将标题与多个字典键值匹配,从CSV获取行,python,python-3.x,csv,dictionary,Python,Python 3.x,Csv,Dictionary,我有一个带有标题的CSV文件,我想从CSV中检索与字典键值匹配的所有行。请注意,字典可以包含任意数量的要匹配的轨道键和值 这是我为解决这个问题而编写的代码,有没有其他更好的方法来解决这个问题(除了pandas dataframe) 更好的方法是去除不必要的变量(如有)?与以下解决方案相比,更好的数据结构、更好的库、更低的空间/时间复杂性 options = {'h1': 'v1', 'h2': 'v2'} output = [] with open("data.csv", &

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

这是我为解决这个问题而编写的代码,有没有其他更好的方法来解决这个问题(除了pandas dataframe)

更好的方法是去除不必要的变量(如有)?与以下解决方案相比,更好的数据结构、更好的库、更低的空间/时间复杂性

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)


您可以使用列表理解来读取和过滤听写器的行。将想要的选项设置为一组,然后对交叉点进行简单测试

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()))
“更好”取决于用例。对于只做一次的事情,“更好”意味着第一种有效的方法。对于在同一个csv文件上对不同的密钥进行多次检查,花时间将csv数据加载到数据库或内存中的自定义容器中可能会更好。如何索引数据库以及如何安排定制容器,这些都可能非常依赖于更多的用例细节。