Excel与Python的差异

我正在寻找一种algorithm来在Python中基于它们的列名来comapre两个excel表。

我不知道列是什么,所以一张表可能有一个额外的列或两张表可以有几个同名的列。

最简单的情况是,第一张表格中的一列与第二张表格中的一列相对应。 然后我可以使用xlrd在该列的行上执行diff。 如果列名不唯一,我可以validation列是否具有相同的位置。

有谁知道一个已经存在的algorithm或有任何经验,在这个领域?

快速肮脏:

 # Since order of the names doesn't matter, we can use the set() option matching_names = set(sheet_one_names) & set(sheet_one_names) ... # Here, order does matter since we're comparing rowdata.. # not just if they match at some point. matching_rowdata = [i for i, j in zip(columndata_one, columndata_two) if i != j] 

注意:这假设你已经做了一些事情,

  1. 通过xlrd获取工作表1的列名,为第二个工作表xlrd相同的名称,
  2. 在两个不同的variables中获取两张纸的行数据。

这是给你一个想法。

另请注意,执行选项(第二个选项)时,行的长度必须相同,否则将被跳过。 这是一个MISS-MATCH场景,与获取数据stream中的匹配相反。

这是一个较慢但function性的解决scheme:

 column_a_name = ['Location', 'Building', 'Location'] column_a_data = [['Floor 1', 'Main', 'Sweden'], ['Floor 2', 'Main', 'Sweden'], ['Floor 3', 'Main', 'Sweden']] column_b_name = ['Location', 'Building'] column_b_data = [['Sweden', 'Main', 'Floor 1'], ['Norway', 'Main', 'Floor 2'], ['Sweden', 'Main', 'Floor 3']] matching_names = [] for pos in range(0, len(column_a_name)): try: if column_a_name[pos] == column_b_name[pos]: matching_names.append((column_a_name[pos], pos)) except: pass # Index out of range, column length are not the same mismatching_data = [] for row in range(0, len(column_a_data)): rowa = column_a_data[row] rowb = column_b_data[row] for name, _id in matching_names: if rowa[_id] != rowb[_id] and (rowa[_id] not in rowb or rowb[_id] not in rowa): mismatching_data.append((row, rowa[_id], rowb[_id])) print mismatching_data