Excel快速比对

import pandas as pd
import warnings
import os
import tkinter as tk
from tkinter import filedialog


def diff(row, params):
    s = set(p for p in params if row[p + '_new'] != row[p + '_old'])
    return "Change " + ",".join(s)


def data_compare(old, new):
    old = old.drop(old.columns[0], axis=1)
    new = new.drop(new.columns[0], axis=1)

    delete = old[~old['Port Name'].isin(new['Port Name'])]
    delete['Status'] = 'Delete'

    create = new[~new['Port Name'].isin(old['Port Name'])]
    create['Status'] = 'Create'

    union = pd.merge(old, new, on='Port Name', suffixes=('_old', '_new'))
    res = union.apply(diff, args=(old.columns[1:],), axis=1)
    union['Status_new'] = res
    change = union[union['Status_new'] != 'Change '].filter(regex='Port Name|_new$')
    change.columns = change.columns.str.replace('_new', '')
    return pd.concat([delete, create, change])


if __name__ == '__main__':
    warnings.simplefilter("ignore")
    root = tk.Tk()
    root.withdraw()
    new_folder = filedialog.askdirectory(title="选择new文件夹")
    old_folder = filedialog.askdirectory(title="选择old文件夹")
    res_file = os.path.join(os.getcwd(), 'ChangeLog.xlsx')
    if os.path.isfile(res_file):
        os.remove(res_file)
    models = os.listdir(old_folder)

    AllRport = pd.DataFrame()
    AllPport = pd.DataFrame()

    for f_name in models:
        print("Reading " + f_name)
        f_path = os.path.join(old_folder, f_name)
        if os.path.isdir(f_path) and f_name.startswith("Vc"):
            f_old = os.path.join(f_path, '_doc', f_name + '.xlsx')
            f_new = os.path.join(new_folder, f_name, '_doc', f_name + '.xlsx')
            if not os.path.isfile(f_new):
                print("new文件夹内缺少 " + f_name)
                continue
        else:
            continue

        data_old = pd.read_excel(f_old, sheet_name=['Pport', 'Rport'], keep_default_na=False)
        data_new = pd.read_excel(f_new, sheet_name=['Pport', 'Rport'], keep_default_na=False)
        Rport = data_compare(data_old['Rport'], data_new['Rport'])
        Rport['Model'] = f_name
        AllRport = pd.concat([AllRport, Rport])
        Pport = data_compare(data_old['Pport'], data_new['Pport'])
        Pport['Model'] = f_name
        AllPport = pd.concat([AllPport, Pport])

    with pd.ExcelWriter('ChangeLog.xlsx') as writer:
        AllRport.to_excel(writer, sheet_name='Rport', index=False)
        AllPport.to_excel(writer, sheet_name='Pport', index=False)
    print("Done!")
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值