- 精华
- 阅读权限
- 80
- 好友
- 相册
- 分享
- 听众
- 收听
- 注册时间
- 2024-2-27
- 在线时间
- 小时
- 最后登录
- 1970-1-1
|
发表于 2024-4-8 17:26:46
|
显示全部楼层
分享一个比较xls配置文件变动的脚本,如果自己改了配置(比如item.xls,pet.xls什么的)可以在更新前用一下,手动修改完再更新,不然几百几千行对比起来还是挺费劲的。
目前只是按行比较,有时间了可能会改成按字段比较。
- import os
- import xlrd
- import xlwt
- # 这里填当前服务器中的xls配置文件路径
- current_path = 'e:/current'
- # 这里填更新包中的xls配置文件路径
- new_path = 'e:/config'
- # ↓↓↓ 这里填比较结果存放路径.注意,该文件夹里的文件都会被删掉
- diff_path = 'e:/diff' # 注意,该文件夹里的文件都会被删掉
- def write_modify_col(file_name, new_cols):
- workbook = xlwt.Workbook()
- sheet = workbook.add_sheet('1')
- length = len(new_cols)
- half = int(length / 2)
- for i in range(length):
- if i < half:
- sheet.write(0, i, new_cols[i])
- else:
- sheet.write(1, i - half, new_cols[i])
- diff = os.path.join(diff_path, file_name)
- workbook.save(diff)
- def write_diff_row(file_name, current_values, new_values):
- workbook = xlwt.Workbook()
- sheet = workbook.add_sheet('1')
- row = 0
- for key in current_values:
- col = 0
- current_value = current_values.get(key)
- sheet.write(row, col, str(key) + '_remove')
- for v in current_value:
- col += 1
- sheet.write(row, col, v)
- row += 1
- for key in new_values:
- col = 0
- new_value = new_values.get(key)
- sheet.write(row, col, key)
- for v in new_value:
- col += 1
- sheet.write(row, col, v)
- row += 1
- diff = os.path.join(diff_path, file_name)
- workbook.save(diff)
- def compare(file_name):
- current = os.path.join(current_path, file_name)
- new = os.path.join(new_path, file_name)
- current_sheet = xlrd.open_workbook_xls(current).sheet_by_index(0)
- new_sheet = xlrd.open_workbook_xls(new).sheet_by_index(0)
- current_cols = []
- new_cols = []
- if current_sheet.nrows < 2 or new_sheet.nrows < 2:
- print(f'file_name:{file_name}行数 current:{current_sheet.nrows}, new: {new_sheet.nrows}')
- return
- for i in range(current_sheet.ncols):
- current_cols.append(current_sheet.cell_value(0, i))
- for i in range(new_sheet.ncols):
- new_cols.append(new_sheet.cell_value(0, i))
- for i in range(current_sheet.ncols):
- current_cols.append(current_sheet.cell_value(1, i))
- for i in range(new_sheet.ncols):
- new_cols.append(new_sheet.cell_value(1, i))
- if current_cols != new_cols:
- write_modify_col(file_name, new_cols)
- return
- current_values = {}
- for row in range(current_sheet.nrows):
- if row == 1:
- continue
- cell_value = current_sheet.cell_value(row, 0)
- # 第一行是字段名
- if type(cell_value) != float and type(cell_value) != int:
- continue
- # 假设第一列是id
- id = int(cell_value)
- current_values[id] = current_sheet.row_values(row, 1, current_sheet.ncols)
- new_values = {}
- for row in range(new_sheet.nrows):
- if row == 1:
- continue
- cell_value = new_sheet.cell_value(row, 0)
- # 第一行是字段名
- if type(cell_value) != float and type(cell_value) != int:
- continue
- id = int(cell_value)
- new_value = new_sheet.row_values(row, 1, new_sheet.ncols)
- if current_values.__contains__(id):
- current_value = current_values.pop(id)
- if current_value == new_value:
- continue
- new_values[id] = new_value
- if len(new_values) > 0 or len(current_values) > 0:
- write_diff_row(file_name, current_values, new_values)
- def traversal_folder():
- for file_name in os.listdir(current_path):
- if not file_name.endswith('xls'):
- continue
- for file_name_new in os.listdir(new_path):
- if file_name == file_name_new:
- compare(file_name)
- os.makedirs(diff_path, exist_ok=True)
- for file_name in os.listdir(diff_path):
- full_path = os.path.join(diff_path, file_name)
- if os.path.isfile(full_path):
- os.remove(full_path)
- traversal_folder()
复制代码 |
|