在Python 3中创建一个脚本来比较两个CSV,并将两者之间的相似点和差异输出到另一组CSV中

时间:2017-11-24 14:07:41

标签: python mysql csv compare

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

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

这将帮助我直观地了解差异是什么,并相应地采取行动。

以下是我正在寻找的一个例子。

enter image description here

以下代码是我到目前为止的代码

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中的角色。

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

resultsSame.cSV resultsDifference.CSV

如果你看一下上面的内容,我似乎无法弄清楚你是如何得到你的输出的,因为这正是我想要的!说实话,我不需要打印标题,因为我也在比较它们,由于用户错误,它们有时可能会结束。

Printed df1 and df2

2 个答案:

答案 0 :(得分:0)

使用pandas可以让您的工作更轻松。这是片段,并且是自我解释的。

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 merge function Pandas-merge function

的文档

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

<强> Excel1 Excel1

<强> Excel2 Excel2

<强> resultsSame.csv resultsSame.csv

<强> resultsDifference.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,,

答案 1 :(得分:0)

以下是您的代码的修改版本。

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)