【问题标题】:Python: print column wise differencesPython:打印列差异
【发布时间】:2020-03-31 18:10:45
【问题描述】:

我有下面的 python 代码来比较 2 个 CSV 文件行,并匹配每个列字段并显示差异。但是输出不正确,请帮助改进代码输出。

(我用谷歌搜索并找到了一个python包csvdiff,但它需要指定列号。)

2 CSV files:

cat file1.csv
1,2,2222,3333,4444,3,

cat file2.csv
1,2,5555,6666,7777,3,

My Python3 code:

with open('file1.csv', 'r') as t1, open('file2.csv', 'r') as t2:
    filecoming = t1.readlines()
    filevalidation = t2.readlines()

for i in range(0,len(filevalidation)):
    coming_set = set(filecoming[i].replace("\n","").split(","))
    validation_set = set(filevalidation[i].replace("\n","").split(","))
    ReceivedDataList=list(validation_set.intersection(coming_set))
    NotReceivedDataList=list(coming_set.union(validation_set)- 
    coming_set.intersection(validation_set))
    print(NotReceivedDataList)

output:

['6666', '5555', '3333', '2222', '4444', '7777']

即使它正在打印两个文件的差异,输出也不是按顺序排列的。 (与file2有3处不同,与file1有3处不同)

我正在尝试生成按列显示的结果,即 file1 中的每个差异与 file2 中的相应差异。

somethinglike

2222  - 5555
3333  - 6666
4444  - 7777

请帮忙,

提前致谢。

【问题讨论】:

标签: python csv


【解决方案1】:

试试这个:

import pandas
with open('old.csv', 'r') as t1, open('new.csv', 'r') as t2:
    filecoming = t1.readlines()
    filevalidation = t2.readlines()

for i in range(0,len(filevalidation)):
    coming_set = set(filecoming[i].replace("\n","").split(","))
    validation_set = set(filevalidation[i].replace("\n","").split(","))
    ReceivedDataList=list(validation_set.intersection(coming_set))
    NotReceivedDataList=list(coming_set.union(validation_set)-coming_set.intersection(validation_set))
    print(NotReceivedDataList)

old=[]
new=[]
for items in NotReceivedDataList:
    if items in coming_set:
        old.append(items)

    elif items in validation_set:
        new.append(items)
print(old)
print(new)

输出:

['2222', '5555', '6666', '3333', '4444', '7777']
['2222', '3333', '4444']
['5555', '6666', '7777']

加法: 这是我对你的帮助更多 让我们从 CSV 文件中获取旧的和新的,然后 [item for item in old if item not in new] 会为您提供不在 new 中的项目。同样在enumerate 的帮助下,我们可以识别列不同(差异在第 2,3 和 4 列)

old=[1,2,2222,3333,4444,3]
new=[1,2,5555,6666,7777,3]

print([item for item in old if item not in new])
print([item for item in new if item not in old])

for index, (first, second) in enumerate(zip(old, new)):
    if first != second:
        print(index, first ,second)

输出:

[2222, 3333, 4444]
[5555, 6666, 7777]
2 2222 5555
3 3333 6666
4 4444 7777

【讨论】:

  • 非常感谢 Mohsen。第二个选项是符合我要求的选项。
  • 除了enumerate 的最后一个循环之外,这个答案的大部分都继承了问题代码中的错误,例如实际上没有按列检查差异 - 2,11,2 之间的差异会不会被检测到。
猜你喜欢
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 2014-10-19
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
相关资源
最近更新 更多