python 两个表格字段列名称值,对比字段差异

支持xlsx,xls文件,相互对比字段列

输出两个表格文件相同字段,置底色为绿色

存在差异的不同字段,输出两个新的表格文件,差异字段,置底色为红色

import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
import os


def convert_xls_to_xlsx(file):
    if file.endswith('.xls'):
        df = pd.read_excel(file, engine='xlrd')
        xlsx_file = file.replace('.xls', '.xlsx')
        df.to_excel(xlsx_file, index=False)
        return xlsx_file
    return file


def read_excel_file(file):
    if file.endswith('.xlsx') or file.endswith('.xls'):
        return pd.read_excel(file)
    else:
        raise ValueError("Unsupported file format: {}".format(file))


def load_workbook_file(file):
    if file.endswith('.xlsx'):
        return load_workbook(file)
    elif file.endswith('.xls'):
        raise ValueError("openpyxl does not support .xls files directly. Convert to .xlsx first.")
    else:
        raise ValueError("Unsupported file format: {}".format(file))


def compare_headers(file1, file2):
    # 检查文件是否存在
    if not os.path.exists(file1):
        print(f"文件 {file1} 不存在")
        return
    if not os.path.exists(file2):
        print(f"文件 {file2} 不存在")
        return

    # 如果是 .xls 文件,先转换为 .xlsx 文件
    file1 = convert_xls_to_xlsx(file1)
    file2 = convert_xls_to_xlsx(file2)

    try:
        # 读取两个文件的数据
        df1 = read_excel_file(file1)
        df2 = read_excel_file(file2)
    except Exception as e:
        print(f"读取文件时出错: {e}")
        return

    # 获取两个文件的列名
    headers1 = df1.columns.tolist()
    headers2 = df2.columns.tolist()

    # 找出两个文件中列名相同和不同的列
    same_headers = [h for h in headers1 if h in headers2]
    diff_headers1 = [h for h in headers1 if h not in headers2]
    diff_headers2 = [h for h in headers2 if h not in headers1]

    # 设置填充颜色
    green_fill = PatternFill(fill_type='solid', fgColor='00FF00')
    red_fill = PatternFill(fill_type='solid', fgColor='FF0000')

    try:
        # 加载两个工作簿
        wb1 = load_workbook_file(file1)
        wb2 = load_workbook_file(file2)
    except Exception as e:
        print(f"加载工作簿时出错: {e}")
        return

    # 获取第一个工作表
    ws1 = wb1.active
    ws2 = wb2.active

    # 遍历列,设置颜色
    for i, header in enumerate(headers1, start=1):
        if header in same_headers:
            ws1.cell(row=1, column=i).fill = green_fill
        else:
            ws1.cell(row=1, column=i).fill = red_fill

    for i, header in enumerate(headers2, start=1):
        if header in same_headers:
            ws2.cell(row=1, column=i).fill = green_fill
        else:
            ws2.cell(row=1, column=i).fill = red_fill

    # 保存文件
    output_file1 = 'output1.xlsx'
    output_file2 = 'output2.xlsx'

    try:
        wb1.save(output_file1)
        wb2.save(output_file2)
    except Exception as e:
        print(f"保存文件时出错: {e}")
        return

    # 输出对比结果
    print('两表格文件对比后相同字段:', same_headers)
    print('表格文件1,存在差异字段:', diff_headers1)
    print('表格文件2,存在差异字段:', diff_headers2)


# xlsx 和 xls 文件对比
compare_headers('file1.xls', 'file2.xls')

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/647909.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【云原生】Kubernetes-----POD资源限制与探针机制

目录 引言 一、资源限制 (一)基本定义 (二)资源单位 1.CPU资源 2.内存资源 (三)请求与限制 (四)定义方式 1.编写yaml文件 2.查看资源情况 (五)资源…

Gradient-checkpointing的原理

原文: 将更大的网络安装到内存中。|by 雅罗斯拉夫布拉托夫 |张量流 |中等 (medium.com) 前向传播时,隔几层就保留一层activation数据,其余层的activation都释放掉; 反向传播时,从最近的checkpoint去重新跑forward&…

Cohere继Command-R+之后发布大模型Aya-23,性能超越 Gemma、Mistral 等,支持中文

前言 近年来,多语言大模型(MLLM)发展迅速,但大多数模型的性能依然存在显著差距,尤其是在非英语语言方面表现不佳。为了推动多语言自然语言处理技术的发展,Cohere团队发布了新的多语言指令微调模型家族——…

cpolar内网穿透工具—无需部署,远程访问网址

文章目录 cpolar介绍安装教程隧道管理VIP客户cpolar介绍 cpolar是一种安全的内网穿透服务,它将局域网下面的本地服务器通过加密隧道暴露至公网,使得公网用户可以正常访问内网服务。 只需一行命令,就可以将内网站点发布至公网,方便给客户演示。高效调试微信公众号、小程序…

设计模式:适配器模式(Adapter)

设计模式:适配器模式(Adapter) 设计模式:适配器模式(Adapter)模式动机模式定义模式结构时序图模式实现在单线程环境下的测试在多线程环境下的测试模式分析优缺点适用场景应用场景应用实例适配器模式和代理模…

JAVA实现图书管理系统(初阶)

一.抽象出对象: 1.要有书架,图书,用户(包括普通用户,管理员用户)。根据这些我们可以建立几个包,来把繁杂的代码分开,再通过一个类来把这些,对象整合起来实现系统。说到整合&#xf…

Day04:CSS 进阶

目标:掌握复合选择器作用和写法;使用background属性添加背景效果 一、复合选择器 定义:由两个或多个基础选择器,通过不同的方式组合而成。 作用:更准确、更高效的选择目标元素(标签)。 1、后…

ros 学习记录(四)仿真环境中键盘控制turtlebot3运动

仿真环境中键盘控制turtlebot3运动 准备工作1. 监听键盘敲击:key_publisher.py2. 控制turtlebot3运动:keys_to_twist_using_rate.py3. 测试4. 数据监视 准备工作 名称版本ROSNoeticGazebo11.11.0python3.8.10 turtlebot3的安装与仿真环境搭建请看上一篇…

视频播放器-Kodi

一、前言 Kodi 是一款开源免费的多媒体播放软件。Kodi 是由非营利性技术联盟 Kodi 基金会开发的免费开源媒体播放器应用程序。 Kodi是一款免费和开源(遵循GPL协议)的多媒体播放器和娱乐中心软件,由XBMC基金会开发。Kodi的主要功能是管理和播…

three.js判断物体在人的前面,还是后面

three.js判断物体在人的前面,还是后面 const player new THREE.Vectors(10, 0, 5); const mesh new THREE.Vectors(15, 0, 6);上面,两个变量分别表示,玩家的位置,物体的位置。 从这发现,当玩家和物体的角度关系 小…

报错:c2665 ”loadimage“没有重载函数可以转换所有参数类型

解决方法: 右键项目选择属性-》高级-》字符集-》使用多字节字符集-》确定

SparkStreaming概述

Spark概述 SparkStreaming概述 Spark Streaming 是 Apache Spark 生态系统中的一个组件,用于实时流数据处理。它允许用户通过流式计算引擎处理实时数据流,并以低延迟的方式对数据进行分析、处理和存储。 背景 在大数据领域,传统的批处理系统…

什么是云渗透测试?

推荐阅读: 什么是安全态势? 什么是人肉搜索 什么是恶意软件? 什么是数字取证? 什么是语音网络钓鱼? 什么是网络安全中的社会工程? 什么是网络安全中的威胁情报? 什么是端点检测和响应 (…

Java进阶:详解与实战Java Stream API

Java进阶:详解与实战Java Stream API 🌟 Java进阶:详解与实战Java Stream API 🌟摘要引言一、Java Stream API介绍📚1. 什么是Java Stream API?2. Java Stream API支持的功能3. 使用Java Stream API的优势…

【vue3+elementuiplus】el-select下拉框会自动触发校验规则

场景:编辑弹框省份字段下拉框必填,触发方式change,有值第一次打开不会触发校验提示,关闭弹框再次打开触发必填校验提示,但是该字段有值 问题的原因是:在关闭弹层事件中,我做了resetfileds&…

react-d3-tree:React组件创建交互式D3树形图

在这里插入代码片import React from "react"; import ReactDOM from "react-dom"; import Tree from "react-d3-tree";import "./styles.css";const myTreeData [{name: "Gaurang Torvekar",attributes: {keyA: "val …

如何使用KNN

导入文件和库 加载数据集、拆分数据集 训练模型 预测 打印结果

自定义Linux命令,显示docker镜像、容器信息

1、修改环境变量(仅对当前用户有效) vim ~/.bashrc2、给命令取别名 alias dpsdocker ps --format "table{{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}" alias disdocker images#保存并退出 :wq3、让配置重新生效 source ~/.bashrc4、测试&…

STM32F1之OV7725摄像头·SCCB总线代码编写附带源码详解

STM32F1之OV7725摄像头-CSDN博客 STM32F1之OV7725摄像头像素数据输出时序、FIFO 读写时序以及摄像头的驱动原理详解-CSDN博客 目录 1. 硬件设计 1.1 SCCB 控制相关 1.2 VGA 时序相关 1.3 FIFO 相关 1.4 XCLK 信号 2. 代码设计 2.1 SCCB总线软件实现 2.1.1 宏定…

【GUI开发基础】

GUI开发基础 🌟项目文件组成✨浅析Pro文件配置 🌟Qt设计师🌟剖析UI文件运行机制🌟UI设计方式✨可视化UI设计✨代码化UI设计 🌟项目文件组成 创建一个QtGUI项目: open QtCreator —> select Creator Pr…