首页 > 解决方案 > 我的代码旨在比较 Python 中的两个 CSV 并打印差异是打印相似之处 - 我的代码有什么问题?

问题描述

我目前有两个 CSV。我正在尝试扫描它们中的每一个,比较这些行,如果其中有一行不在另一行中,我想将该行打印到新的 CSV 中。就目前而言,这是我的代码:

# compares the two files
with open('csv1.csv', 'r') as t1, open('csv2.csv', 'r') as t2: 
    fileone = t1.readlines()
    filetwo = t2.readlines()

# scans through the two files and writes differences to new csv
with open('csv3.csv', 'w') as outFile:
    for line in filetwo:
        if line not in fileone:
            outFile.write(line)

csv1 有 201 行,而 csv2 有 156 行,所以我希望 csv3 有 45 个结果,但是它有 156 个(整个 csv2)。我尝试将逻辑切换到

for line in fileone:
    if line not in filetwo:
         outfile.write(line) 

但这只是让 csv3 为空。

任何帮助,将不胜感激!

我使用的代码也来自Python:比较两个 csv 文件并打印出差异

这是一个出现在两者中但仍显示在 csv3 中的行的示例

,MAJOR,MAJOR_CODE,
0,Accountancy,ACCT, 
1,Aerospace Engineering,AERO

标签: pythoncsv

解决方案


您可以使用set数据结构,特别是它的symmetric_difference()方法。

使用理由set

  • symmetric_difference()方法完全符合您的要求:返回任一集合中的项目,但不返回两者。
  • 查找速度很快,所以即使您不想使用symmetric_difference(),它也会比使用 快得多line not in list_1
s_file1 = set(fileone)
s_file2 = set(filetwo)

s_file3 = s_file1.symmetric_difference(s_file2)

然后,您可以将 的元素写入s_file3输出文件。

注意:集合是无序的,所以这不会保持你的行的顺序。集合也消除了重复,因此如果一行在 file1 中出现两次但在 file2 中出现零次,则重复将被删除,并且您只会在输出中得到该行一次。


如果您关心顺序和重复,并且您的文件很大,那么创建集合然后使用它们来检查循环中的成员可能会更快。

diff_lines = []
for line in fileone:
    if not line in s_file2:
        diff_lines.append(line)

for line in filetwo:
    if not line in s_file1:
        diff_lines.append(line)

然后写入diff_lines您的输出(或直接写入输出而不是附加到diff_lines)。


推荐阅读