比较2个文本文件中具有不同列数的行

时间:2016-01-12 21:09:49

标签: python python-2.7 csv

这是我之前的问题(Compare lines in 2 text files)的补充。

考虑这两个示例文件:

A.csv

AAA,BBB,CCC  
DDD,,EEE  
GGG,HHH,III

B.csv

AAA,,BBB,CCC  
EEE,,DDD,,  
,,GGG,III,HHH

我希望它们相同,即使它们具有不同的字段顺序和列数。

这是我到目前为止所做的:

#!/usr/bin/python
import sys
import csv

f1 = sys.argv[1]
f2 = sys.argv[2]

with open(f1) as i, open(f2) as j:
    a = csv.reader(i)
    b = csv.reader(j)
    for linea in a:
        lineb = next(b)
        if sorted(map(str.lower, linea)) != sorted(map(str.lower, lineb)):
            print('{} does not match {}'.format(linea, lineb))

更新

这是我最终的结果(感谢@keksnicoh):

#!/usr/bin/python
import sys
import csv

f1 = sys.argv[1]
f2 = sys.argv[2]

with open(f1) as i, open(f2) as j:
    a = csv.reader(i)
    b = csv.reader(j)
    for linea in a:
        lineb = next(b)
        seta = set([x for x in linea if len(x) > 0])
        setb = set([x for x in lineb if len(x) > 0])
        if (seta != setb):
            print('Line {} does not match: {}'.format(a.line_num, seta ^ setb))

我现在面临的问题是:如何处理重复项,例如:

示例文件A.csv

1,2 ,,
1,2,2,3,4

示例文件B.csv

1,2,2,2-
1,2,3,4-

上面的脚本认为文件是相同的,但它们不是。从搜索Stackoverflow,似乎我不能使用集,但必须使用列表。但后来我失去了使用集合的优势,这不必担心字段的顺序。

如何修改我的代码以考虑重复的条目?

1 个答案:

答案 0 :(得分:0)

您可以将线条映射到一组并过滤空字符串。现在计算这些集合的对称差异并检查新集合的长度。

#!/usr/bin/python
import sys
import csv

f1 = sys.argv[1]
f2 = sys.argv[2]

with open(f1) as i, open(f2) as j:
    a = csv.reader(i)
    b = csv.reader(j)
    for linea in a:
        lineb = next(b)
        seta = set([x for x in linea if len(x) > 0])
        setb = set([x for x in lineb if len(x) > 0])
        print(len(seta^setb)==0)

你也可以写这个更紧凑的

for seta in (set([x for x in l if len(x) > 0]) for l in a):
    setb = set([x for x in next(b) if len(x) > 0])
    print(len(seta^setb)==0)

<强>更新

为了让事情变得简单,当然可以检查

seta==setb
抱歉混淆......