使用python基于主csv文件验证csv中的条目

时间:2016-07-19 03:21:54

标签: python validation csv

我目前正在使用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,有效)。

我希望这是有道理的,我整夜都在和它摔跤。如果我能在这里澄清任何内容,请告诉我

2 个答案:

答案 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_CID_D匹配的所有ID_AID_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