这是我之前的问题(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,似乎我不能使用集,但必须使用列表。但后来我失去了使用集合的优势,这不必担心字段的顺序。
如何修改我的代码以考虑重复的条目?
答案 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
抱歉混淆......