如何比较两个csv文件的列?

0 投票
3 回答
3538 浏览
提问于 2025-04-17 16:36

我正在尝试比较两个csv文件中的列。

在file1.csv中:

aaa,1
abc,2
bcd,2
adc,3

在file2.csv中:

aaa,1
abc,0
bcd,2
adc,4

我原本期待得到的结果是“Not Equ”。

如果第一列相同但第二列不同的话。

我尝试了下面的代码,但没有成功:

import csv
file1 = 'C:/Users/Desktop/file1.csv'
file2 = 'C:/Users/Desktop/file2.csv'

reader1 = csv.reader(open(file1))
reader2 = csv.reader(open(file2))

for row1 in reader1:
    text1 = row1[0].split(',')
    test1sentence = text1[0]
    test1class = text1[1]

    for row2 in reader2:
        text2 = row2[0].split(',')
        test2sentence = text2[0]
        test2class = text2[1]

        if test1sentence == test2sentence:
            if test1class != test2class:
                print "Not Equ"

有什么建议吗?

3 个回答

0

你可以把它解析成字典,然后进行比较,像这样:

>>> d1={'aaa':1, 'abc':2, 'bcd':2, 'adc':3}
>>> d2={'aaa':1, 'abc':0, 'bcd':2, 'adc':4}
>>> d1==d2
False
>>> d2={'aaa':1, 'abc':2, 'bcd':2, 'adc':3}
>>> d1==d2
True
2

你实际上是在比较字典(或者叫映射),也就是把键和对应的值进行匹配。

正确的做法是比较键的集合。如果它们相等,那么对于每一个键,要比较两个文件中对应的值。

#!/usr/bin/python

def file_to_dict(filename):
    lines  =  open(filename).read().split()
    return dict([line.split(',') for line in lines])

dict1, dict2 = file_to_dict('file1.csv'), file_to_dict('file2.csv')

print "Keys are equal? ", set(dict1.keys())==set(dict2.keys())
print "Values are equal? ", all([dict1[key]==dict2[key] for key in dict1])
1

你可以把文件读入两个字典,然后这样进行比较:

dict1 = dict(row for row in reader1 if len(row) == 2)
dict2 = dict(row for row in reader2 if len(row) == 2)

if sorted(dict1.keys()) == sorted(dict2.keys()):
    if dict1 != dict2:
        print "Not Equ"

dict(reader1) 会把第一列变成字典的键,把第二列变成值。

这个生成器表达式 (row for row in reader1 if len(row) == 2) 会筛选出那些正好有两列的行,其他的行会被过滤掉。

在比较键的时候,必须先把它们排序。直接比较整个字典(dict1 != dict2)会比较排序后的键值对。因为我们先比较了键,所以如果整个字典有差异,那一定是值的不同。


编辑:如果要比较单个项目,而不是整列:

dict1 = dict(row for row in reader1 if len(row) == 2)
dict2 = dict(row for row in reader2 if len(row) == 2)

for key, val in dict1.iteritems():
    try:
        if dict2[key] != val:
            print "Not Equ"
    except KeyError:
        pass

撰写回答