【问题标题】:Creating a script in Python 3 to compare two CSVs and output the similarities and differences between the two into another set of CSVs在 Python 3 中创建一个脚本来比较两个 CSV,并将两者之间的异同输出到另一组 CSV
【发布时间】:2017-11-24 14:07:41
【问题描述】:

我有两个 CSV,理想情况下,CSV 将包含相同的数据,实际上有时内容可能会有所不同。我没有手动浏览这两个 CSV 并找出相同和不同之处,而是尝试创建一个我将每周运行的 python 脚本,它会告诉我哪些相同,哪些不同。

这是逻辑。 1. 给定 2 个 CSV 2.逐行比较。 3. 两个 CSV 之间的任何不同行都应记录到另一个 CSV(整行/秒) 4. CSV 之间的任何相同行都应记录到另一个 CSV(整行)中。

这将帮助我直观地了解不同之处并采取相应措施。

以下是我正在寻找的示例。

下面的代码是我目前所拥有的

with open('Excel 1.csv', 'r') as csvOne, open('Excel 2.csv', 'r') as csvTwo:
    csvOne = csvOne.readlines()
    csvTWO = csvTWO.readlines()

 with open('resultsSame.csv', 'w') as resultFileSame:
     for row in csvTWO:
         if row not in csvONE:
            resultFileSame.write(row)

 with open('resultsDifference.csv', 'w') as resultFileDifference:
     for row in csvTWO:
         if row in csvONE:
             resultFileDifference.write(row)

我希望脚本比较行,并且仅当行之间存在相似性或差异时才将其输出到另一组 CSV 中。上面的代码有效,但它删除了一个 CSV 中的列,而不是另一个而不是行中的列。我想保留这些列,即使它们不在另一个 CSV 中,并且只在单独的 CSV 中显示一个或另一个中的角色。

请在下面查看我在您的数据集示例上运行您给出的第一个代码时得到的结果。

如果您查看以上内容,我似乎无法弄清楚您是如何获得输出的,因为这正是我想要的!老实说,我也不需要打印标题,因为我也在比较它们,它们有时会由于用户错误而结束。

【问题讨论】:

    标签: python mysql csv compare


    【解决方案1】:

    这是修改后的代码。

    with open('excel1.csv', 'r') as csvOne, open('excel2.csv', 'r') as csvTwo:
      csvONE = csvOne.readlines()
      csvTWO = csvTwo.readlines()
    
    with open('resultsDifference.csv', 'w') as resultFileDifference:
     # Write the header to difference file. 
     # Because, the headers are same for 2 input CSVs, the header row will be obviously into resultsSame.csv
     resultFileDifference.write(csvONE[0])
     for row in csvTWO:
         if row not in csvONE:
            resultFileDifference.write(row)
    
    with open('resultsSame.csv', 'w') as resultFileSame:
     for row in csvTWO:
         if row in csvONE:
             resultFileSame.write(row)
    

    【讨论】:

    • 我不太明白你用 resultsDifference 交换 resultsSame 做了什么?
    • 嗨@AdamJohns 我相信您想将两个 CSV 之间的差异捕获/写入 resultsDifference.csv 并将相似性写入 resultsSame.csv。但不知何故,文件名已经互换,所以我只是设法将它们放在适当的循环中,并且没有重命名变量。我现在已经编辑了我的答案。重要的 sn-p 是将标头写入差异文件中。就是这样!
    • 无论如何,我在这里给出的答案你不会得到行索引。您可以使用 pandas 版本的代码获得行索引。
    【解决方案2】:

    使用 pandas 将使您的工作更轻松。这是 sn-p 并且是不言自明的。

    import pandas as pd
    df1 = pd.read_csv('excel1.csv')
    df2 = pd.read_csv('excel2.csv')
    
    merged = df1.merge(df2, indicator=True, how='outer')
    diff_df = merged[merged['_merge'] == 'right_only'].drop('_merge', axis=1)
    similar_df = merged[merged['_merge'] == 'both'].drop('_merge', axis=1)
    print(diff_df)
    print(similar_df)
    
    diff_df.to_csv('resultsDifference.csv', index=False)
    similar_df.to_csv('resultsSame.csv', index=False)
    

    pandas 合并函数文档Pandas-merge function

    我根据您在问题中给出的示例创建了脚本。这是示例的输入和输出的快照。

    Excel1

    Excel2

    resultsSame.csv

    resultsDifference.csv

    我确信脚本会产生您在问题中引用的结果,但索引除外。如果您对问题中的行索引感兴趣,那么下面是更新的脚本。让我知道它是否满足您的需求。

    import pandas as pd
    df1 = pd.read_csv('excel1.csv')
    df2 = pd.read_csv('excel2.csv')
    
    merged = df1.merge(df2, indicator=True, how='outer')
    diff_df = merged[merged['_merge'] == 'right_only'].drop('_merge', axis=1)
    similar_df = merged[merged['_merge'] == 'both'].drop('_merge', axis=1)
    diff_df.index = range(1,len(diff_df)+1)
    similar_df.index = range(1,len(similar_df)+1)
    diff_df.to_csv('resultsDifference.csv')
    similar_df.to_csv('resultsSame.csv')
    

    啊!我在想!!!这些是我拥有的 CSV 文件内容.. excel1.csv

    A,B,C,D
    A,A,A,A
    B,B,B,B
    C,C,C,A
    D,,,
    

    excel2.csv

    A,B,C,D
    A,A,A,A
    B,B,B,B
    C,C,C,C
    D,D,,
    

    【讨论】:

    • 我认为我需要为此安装 pandas 模块,因为我收到错误消息。有没有办法在没有模块的情况下做我想做的事?真的很感激。
    • 当然可以。我在这里发布了另一个答案。我已经在你的代码中添加了一段代码,只写标题。您可以使用 pandas 获得方便的功能,并且只需“pip install pandas”就可以很好地安装(如果您有 pip 或其他安装源/方法)
    • Vivek,我是 Python 新手,我现在也安装了 pandas 模块。上面的代码确实有效,但我不确定它真正输出的是什么——我认为这不是我想要的。我只需要 2 个 csvs 来输出另外 2 个 csvs,它们显示了两者之间的异同。
    • 嗨@AdamJohns 我添加了一个sn-p,它将索引以及相似/差异写入CSV。
    • 能否请您添加输入数据帧的屏幕截图。我的意思是,使用 python 打印语句。 “打印(df1);打印(df2);”。我怀疑输入 CSV。
    猜你喜欢
    • 2016-08-16
    • 2018-07-21
    • 1970-01-01
    • 2014-12-10
    • 2022-01-24
    • 2020-07-21
    • 2016-11-10
    • 1970-01-01
    • 2016-06-29
    相关资源
    最近更新 更多