我目前正在使用Python 2.6。我需要编写一个脚本来读取一个' master' csv文件然后匹配主服务器的第二个csv文件中的条目以确定其有效性。主和辅助csv文件具有相同数量的列,每个列具有相似的值。我试图遍历辅助csv文件中的每个条目,然后将它们与主csv中的每个条目进行匹配。如果辅助csv文件中的给定条目与主csv中的任何条目匹配,则该条目将被视为有效。
master csv文件看起来像这样:
ID_A,ColumnB,ID_C,ColumnD
1,text,0,words
1,text,1,words
2,text,A,words
3,text,CC,words
' ID'价值正在推动验证过程和“列”。价值是辅助的。首先,我需要将这个主csv放入内存中,这样我就可以比较来自辅助csv的条目。为此,我试图将csv读入字典。然后我循环遍历每一行,但只能真正弄清楚如何打印这些值。
with open ('master.csv') as csvfile:
masterReader = csv.DictReader(csvfile)
for row in masterReader:
print(row['ID_A'], row['ID_C'])
我不需要只是读取和打印这些文件,而是需要找到一种方法将它们存储在内存中,这样我就可以将它们与次要csv中的条目进行比较,如下所示:
ColumnA,ColumnB,ID_C,ID_D
text,words,160,7
text,words,250,BB
text,words,1,0
text,words,15,A
将ID_C与master-ID_A进行比较,并将ID_D与master-ID_C进行比较。我认为最好首先测试master-ID_A,因为如果没有匹配,那么测试master-ID_C是没用的。
我尝试使用我发现here和(comparing varied CSV files in python)的其他帖子中的方法,但似乎无法得到我想要的结果。
我想创建一个具有两个独立函数的类,这些函数将读取主csv,然后根据输入ID值验证辅助csv中的条目。我还希望能够更改输入主数据(具有相同格式)和辅助csv,以便脚本可以在多个数据集上使用。验证辅助条目后,我想看(ID_C,ID_D,有效)。
我希望这是有道理的,我整夜都在和它摔跤。如果我能在这里澄清任何内容,请告诉我
答案 0 :(得分:0)
所以看看你的两个问题部分
将master读入内存。使用字典理解来使用row['ID_A']
的密钥读取整个主文件,例如:
with open('master.csv') as csvfile:
reader = csv.DictReader(csvfile)
master = {row['ID_A']: row for row in reader}
第二个问题如何将辅助csv与这个主列表进行比较,再次使用列表理解与一个后卫是非常简单的:
with open('secondary.csv') as csvfile:
reader = csv.DictReader(csvfile)
result = [(row['ID_C'], row['ID_D'], 'Valid') for row in reader
if row['ID_C'] in master and master['ID_C']['ID_C'] == row['ID_D']]
警卫检查master
字典密钥(ID_A
)是否与ID_C
匹配,如果密钥存在,请检查master:ID_C
== ID_D
并且仅当这两个都是True
,它是result
列表。
打印result
会列出主列表中与ID_C
和ID_D
匹配的所有ID_A
和ID_C
。
我会把它作为练习让读者把它们放到课堂上。
答案 1 :(得分:0)
您可以将主文件读取为一组(ID_A, ID_C)
元组,当您进行验证时,只需检查那里是否存在元组(ID_C, ID_C)
:
import csv
class Validator(object):
def read_master(self, master):
with open(master) as f:
reader = csv.DictReader(f)
self.master = set((row['ID_A'], row['ID_C']) for row in reader)
def validate(self, csv_file):
with open(csv_file) as f:
reader = csv.DictReader(f)
keys = ((row['ID_C'], row['ID_D']) for row in reader)
return [list(key) + [key in self.master] for key in keys]
def validate_key(self, id_c, id_d):
return (id_c, id_d) in self.master
用法:
from pprint import pprint
v = Validator()
v.read_master('master.csv')
pprint(v.validate('other.csv'))
print v.validate_key('1', '1')
print v.validate_key('1', '2')
输出:
[['160', '7', False],
['250', 'BB', False],
['1', '0', True],
['15', 'A', False]]
True
False