比较2个不同Excel文件中的1列记录,报告缺少或添加的内容

时间:2013-03-04 17:25:06

标签: python excel

我正在寻找建议,同时在运行月度报告之前比较两个Excel数据文件。我希望这可以在python中完成。

2.xls文件应该相同(一个是当前月份数据,一个是上个月的数据),但可能有一个添加或缺失的记录(作为一行)。我有一个“ID”列,其中包含我要比较的信息。

如果存在任何差异(添加或缺少行),我想报告任何差异。

理想情况下,此报告将导出为.txt或第三个.xls文件。

任何代码片段或样本都将不胜感激!

下面是我在.txt中执行类似操作的代码,但是一旦遇到第一个差异,您就无法看到哪个记录导致问题。

f1 = open("AuditData.txt", "r")
f2 = open("AuditData2.txt", "r")

fileOne = f1.readlines()
fileTwo = f2.readlines()

f1.close()
f2.close()

outFile = open("AuditData3.txt", "w")
x = 0
for i in fileOne:
    if i != fileTwo[x]:
        outFile.write(i+" <> "+fileTwo[x])
    x += 1
outFile.close()

4 个答案:

答案 0 :(得分:4)

我会看the pandas library。例如,如果我们从两个类似的文件开始:

>>> import pandas as pd
>>> 
>>> df0 = pd.ExcelFile("id_data1.xls").parse("Sheet1")
>>> df1 = pd.ExcelFile("id_data2.xls").parse("Sheet1")
>>> df0 = df0.set_index("ID")
>>> df1 = df1.set_index("ID")
>>> df0
    A  B
ID      
1   a  e
2   b  f
3   c  g
4   d  h
>>> df1
    A          B
ID              
1   a          e
2   b  nolongerf
4   d          h
5   g          h

我们可以对齐它们,查看差异,并将结果保存到excel文件中:

>>> a0, a1 = df0.align(df1)
>>> different = (a0 != a1).any(axis=1)
>>> comp = a0[different].join(a1[different], lsuffix='_old', rsuffix='_new')
>>> comp
   A_old B_old A_new      B_new
ID                             
2      b     f     b  nolongerf
3      c     g   NaN        NaN
5    NaN   NaN     g          h
>>> comp.to_excel("comparison.xls")
>>>

等等。

答案 1 :(得分:1)

xlrdxlwt都是我成功用于读取/写入excel文档的Python库。

答案 2 :(得分:1)

如果excel文件只有一个或几个选项卡,那么最简单的解决方案就是将每个单独的选项卡保存为单独的csv,并使用像diff这样的现有工具,它可以在命令行中使用很多平台,或许多文本编辑器,如vim,emacs或notepad ++。

$ diff file1.csv file2.csv

http://unixhelp.ed.ac.uk/CGI/man-cgi?diff

如果你需要在很多文件上运行它,我仍然建议只使用python作为脚本粘合剂,使用sys库重复调用unix diff程序。

显然,python 在标准库中有一个“difflib”,但我以前从未使用它,甚至没有人听过它,但是欢迎你来看看它:http://docs.python.org/2/library/difflib.html

答案 3 :(得分:0)

几年前我遇到了类似的问题,最终选择C#作为我的解决方案。在设置了基于.NET的环境后,我能够轻松地直接访问excel电子表格的内容。

如果您决定使用python,一种方法是使用COM对象来访问每个电子表格的详细信息: http://oreilly.com/catalog/pythonwin32/chapter/ch12.html

我建议使用C#的原因是.NET具有专门设计的类以便于访问电子表格。 http://msdn.microsoft.com/en-us/library/7fzyhc74(v=vs.80).aspx