前情描述
两份Excel的结构不尽相同,但是有部分字段值可以作为主键,这些列在目标文件中都能找到
主要思路:
-
- 将两个文件的主键作为键,将要核对的列作为值,保存到字典中然后再进行比较
-
- 将两个文件将要比较的字段做成一个列表进行比较。
方法1 代码演示
import xlrd
import xlwt
import time
list2 = 'D:\\MyDocuments\\lit\\Desktop\\ares-host-list\\host3.xls'
list1 = 'D:\\MyDocuments\\lit\\Desktop\\ares-host-list\\yly3.xls'
origin_dict = {} # 初始化,用于保存源文件{key(主键):value(需要核对的列值)}
target_dict = {} # 初始化,用于保存目标文件{key(主键):value(需要核对的列值)}
def compare_excel(ori_path,tar_path,col_ori,col_tar,keys_ori,keys_tar):
'''
ori_path:用于存放源文件
tar_path:用于存放目标文件
col_ori:源文件中需要比较的列
col_tar:目标文件中需要比较的列
keys_ori:源文件中需要比较的列的key
keys_tar:目标文件中需要比较的列key
例子:源文件如下:{'p0-app01': '10.130.51.176',}
目标文件如下:{'p0-web03': '10.130.101.26'}
else:
col_ori = keys_ori ,col_tar = keys_tar
源文件如下:{'10.130.101.152': '10.130.101.152'}
目标文件如下:{'10.81.26.164': '10.81.26.164'}
同样可以比较(却决于你的两张婊子数据)
'''
success = 0 # 核对无差异的个数
fail = 0 # 核对结果有差异的个数
row_res = 0 #要写入的文件的行
# 分别打开源文件与目标文件
wb_ori = xlrd.open_workbook(ori_path)
wb_tar = xlrd.open_workbook(tar_path)
# 新建一个excel,用于存放核对结果
wb_res = xlwt.Workbook()
# 分别获取源文件与目标文件的sheet
sheet_ori = wb_ori.sheet_by_index(0)
sheet_tar = wb_tar.sheet_by_index(0)
# 新建一名称为result的sheet页,用于存放核对具体结果
sheet_res = wb_res.add_sheet('D:\\MyDocuments\\lit\\Desktop\\ares-host-list\\result.xlsx')
# 获取源文件中由主键、需核对列组成的键值对,放入字典中
for row_ori in range(1,sheet_ori.nrows):
cell_ori_key = sheet_ori.cell_value(row_ori,keys_ori) #因我的源文件的主键位于第0列,故该列未参数化,大家可以视自己实际情况进行优化
#cell_ori_key1 = sheet_ori.cell_value(row_ori, 5)
cell_ori_value = sheet_ori.cell_value(row_ori,col_ori)
origin_dict[cell_ori_key] = cell_ori_value
#origin_dict[cell_ori_key + cell_ori_key1] = cell_ori_value
print('源文件如下:%s' % origin_dict)
# 获取目标文件中由主键、待核对列组成的键值对,放入字典中
for row_tar in range(1,sheet_tar.nrows):
cell_tar_key = sheet_tar.cell_value(row_tar,keys_tar)
cell_tar_value = sheet_tar.cell_value(row_tar,col_tar)
target_dict[cell_tar_key] = cell_tar_value
print('目标文件如下:%s' % target_dict)
try:
for i in origin_dict.keys(): # 获取源文件字典的键
if target_dict.get(i) == origin_dict.get(i): # 对比两个字典中相同键的值
success += 1 # 值相等,则无差异数+1
sheet_res.write(row_res+1,0,i) # 将键写入结果文件的第0列
sheet_res.write(row_res+1,1,'你俩长一样') #将核对无差异结果写入结果文件的第1列
row_res += 1 # 结果文件行数+1
print('IP %s 核对无差异'% i)
else:
fail +=1 # 值不相等,则有差异数+1
sheet_res.write(row_res+1,0,i)
sheet_res.write(row_res+1,1,'核对有差异:源文件的值为:%s,目标文件的值为:%s' % (origin_dict.get(i),target_dict.get(i))) # #将核对有差异结果写入结果文件的第1列
row_res += 1 # 结果文件行数+1
print('Host IP %s 核对有差异:源文件的值为:%s,目标文件的值为:%s' % (i,origin_dict.get(i),target_dict.get(i)))
wb_res.save('D:\\MyDocuments\\lit\\Desktop\\ares-host-list\\result.xlsx') # 保存结果文件
print(time.strftime('%Y-%m-%d %H-%M-%S',time.localtime())+'核对完成,共核对 %d 条,其中无差异 %d 条, 有差异 %d条' % (len(origin_dict),success,fail))
except Exception as error:
print(str(error))
compare_excel(list1,list2,4,6,4,6) # 核对源文件第5列,目标文件第7列