Python 通过将标题与多个字典键值匹配,从CSV获取行
我有一个带有标题的CSV文件,我想从CSV中检索与字典键值匹配的所有行。请注意,字典可以包含任意数量的要匹配的轨道键和值 这是我为解决这个问题而编写的代码,有没有其他更好的方法来解决这个问题(除了pandas dataframe) 更好的方法是去除不必要的变量(如有)?与以下解决方案相比,更好的数据结构、更好的库、更低的空间/时间复杂性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", &
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数据加载到数据库或内存中的自定义容器中可能会更好。如何索引数据库以及如何安排定制容器,这些都可能非常依赖于更多的用例细节。