Python使用pandas读取Excel并选取列转json

这篇文章主要为大家详细介绍了通过Python和pyqt5设计一个工具,可以实现pandas读取Excel选取列作为键或值转json,感兴趣的小伙伴可以了解下

目录
  • 1、背景介绍
  • 2、库的安装
  • 3、核心代码
  • 4、完整代码

1、背景介绍

大家都知道在利用Python对表格进行匹配的时候,我们进行会读取一张Excel表格,然后选中其中的

某一列(或者多列)作为唯一项(key),

然后在选中

某一列(或者多列)作为值(value)

2、库的安装

用途 安装
pandas 读取Excel文件 pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple/
PyQt5 界面设计 pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/
os 获取绝对路径 内置库无需安装

3、核心代码

①:选择 列

df = pd.read_excel(self.excel_file_path, dtype=str, keep_default_na=False)
            headers = df.columns.tolist()

for i in reversed(range(self.key_checkboxes_layout.count())):
    self.key_checkboxes_layout.itemAt(i).widget().setParent(None)

for i in reversed(range(self.value_checkboxes_layout.count())):
    self.value_checkboxes_layout.itemAt(i).widget().setParent(None)

②:制作json

df['combined_key'] = df[key_cols].apply(lambda row: "=".join(row.values), axis=1)
df['combined_value'] = df[value_cols].apply(lambda row: "=".join(row.values), axis=1)
data = dict(zip(df['combined_key'], df['combined_value']))

with open(self.output_file_path, "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

4、完整代码

import os
import json
import pandas as pd
from PyQt5.QtWidgets import (
    QApplication, QWidget, QVBoxLayout, QLabel, QPushButton,
    QFileDialog, QMessageBox, QCheckBox, QHBoxLayout
)


class ExcelToJsonApp(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("Excel 转 JSON 工具")
        self.setGeometry(900, 500, 600, 500)

        layout = QVBoxLayout()

        self.folder_label = QLabel("选择 Excel 文件:")
        layout.addWidget(self.folder_label)

        self.folder_button = QPushButton("选择文件")
        self.folder_button.clicked.connect(self.select_excel_file)
        layout.addWidget(self.folder_button)

        self.key_label = QLabel("请选择键列(可多选):")
        layout.addWidget(self.key_label)
        self.key_checkboxes_layout = QVBoxLayout()
        layout.addLayout(self.key_checkboxes_layout)

        self.value_label = QLabel("请选择值列(可多选):")
        layout.addWidget(self.value_label)
        self.value_checkboxes_layout = QVBoxLayout()
        layout.addLayout(self.value_checkboxes_layout)

        self.output_label = QLabel("选择 JSON 输出文件:")
        layout.addWidget(self.output_label)

        self.output_button = QPushButton("选择文件")
        self.output_button.clicked.connect(self.select_output_file)
        layout.addWidget(self.output_button)

        self.convert_button = QPushButton("转换并保存")
        self.convert_button.clicked.connect(self.convert_excel_to_json)
        layout.addWidget(self.convert_button)

        self.setLayout(layout)

    def select_excel_file(self):
        options = QFileDialog.Options()
        file_path, _ = QFileDialog.getOpenFileName(self, "选择 Excel 文件", "", "Excel 文件 (*.xls *.xlsx)",
                                                   options=options)
        if file_path:
            self.folder_label.setText(f"选中文件: {file_path}")
            self.excel_file_path = file_path
            self.load_excel_headers()

    def load_excel_headers(self):
        try:
            df = pd.read_excel(self.excel_file_path, dtype=str, keep_default_na=False)
            headers = df.columns.tolist()

            for i in reversed(range(self.key_checkboxes_layout.count())):
                self.key_checkboxes_layout.itemAt(i).widget().setParent(None)

            for i in reversed(range(self.value_checkboxes_layout.count())):
                self.value_checkboxes_layout.itemAt(i).widget().setParent(None)

            self.key_checkboxes = []
            self.value_checkboxes = []

            for header in headers:
                key_checkbox = QCheckBox(header)
                self.key_checkboxes_layout.addWidget(key_checkbox)
                self.key_checkboxes.append(key_checkbox)

                value_checkbox = QCheckBox(header)
                self.value_checkboxes_layout.addWidget(value_checkbox)
                self.value_checkboxes.append(value_checkbox)
        except Exception as e:
            QMessageBox.warning(self, "错误", f"无法读取 Excel 表头: {e}")

    def select_output_file(self):
        options = QFileDialog.Options()
        file_path, _ = QFileDialog.getSaveFileName(self, "保存 JSON 文件", "", "JSON 文件 (*.json)", options=options)
        if file_path:
            self.output_label.setText(f"输出文件: {file_path}")
            self.output_file_path = file_path

    def convert_excel_to_json(self):
        try:
            key_cols = [cb.text() for cb in self.key_checkboxes if cb.isChecked()]
            value_cols = [cb.text() for cb in self.value_checkboxes if cb.isChecked()]

            if not hasattr(self, 'excel_file_path') or not hasattr(self, 'output_file_path'):
                QMessageBox.warning(self, "错误", "请先选择 Excel 文件和 JSON 输出路径!")
                return

            df = pd.read_excel(self.excel_file_path, dtype=str, keep_default_na=False)

            for key_col in key_cols:
                if key_col not in df.columns:
                    QMessageBox.warning(self, "错误", f"键列 {key_col} 不存在,请检查!")
                    return

            for value_col in value_cols:
                if value_col not in df.columns:
                    QMessageBox.warning(self, "错误", f"值列 {value_col} 不存在,请检查!")
                    return

            df['combined_key'] = df[key_cols].apply(lambda row: "=".join(row.values), axis=1)
            df['combined_value'] = df[value_cols].apply(lambda row: "=".join(row.values), axis=1)
            data = dict(zip(df['combined_key'], df['combined_value']))

            with open(self.output_file_path, "w", encoding="utf-8") as f:
                json.dump(data, f, ensure_ascii=False, indent=4)

            QMessageBox.information(self, "成功", "转换完成,JSON 已保存!")
        except Exception as e:
            QMessageBox.critical(self, "错误", f"处理文件时出错: {e}")


if __name__ == "__main__":
    app = QApplication([])
    window = ExcelToJsonApp()
    window.show()
    app.exec_()

效果图

以上就是Python使用pandas读取Excel并选取列转json的详细内容,更多关于Python Excel转json的资料请关注昆居客【www.kunjuke.com】其它相关文章!

相关推荐:

华为 MateBook Pro 笔记本获 HarmonyOS 6.1.0.130 SP15 升级,支持连接相机读取其中的照片和视频

感谢网友 易团俊、MeoW粉丝小明、雨雪载途 的线索投递! 7 月 2 日消息,华为 MateBook Pro 鸿蒙笔记本今日开启了鸿蒙 HarmonyOS 6.1.0.130 SP15 版本升级,系统包大小约 2.16GB。据介绍,通过本次更新新增用户分级管理能力,多用户使用场景更安全;支持连接相机读取其中的照片和视频;此外还优化了设备在文件管理、浏览器等多种场景下的使用体验。附华为 MateB...

电脑读取手机com.tencent.mm文件教程

无法访问com.tencent.mm目录时,需通过USB文件传输模式、支持隐藏文件的管理器或ADB命令三种方式定位:一、启用MTP模式后手动导航至内部存储/Android/data/com.tencent.mm;二、用Solid Explorer等APP显示隐藏文件并导出;三、开启USB调试后用ADB命令备份导出。 如果您尝试在电脑上访问手机微信的原始数据文件,但无法定位或打开com.tencen...

PxCook如何查看内阴影参数_读取元素内阴影inset属性值【内阴影】

可通过图层样式面板、导出JSON、代码模式或测量工具悬停四种方式获取PxCook中元素的内阴影inset参数:一、右键图层→“查看图层样式”→展开“内阴影”项;二、导出JSON后搜索"shadow"字段;三、切换“代码”模式查找box-shadow中以"inset"开头的值;四、启用测量工具悬停图层边界查看提示框。 如果您在使用PxCook查看设计稿时需要获取元素的内阴影(inset)参数,但界面...

iPhone 15 如何连接 Type-C 接口 U 盘?苹果手机外接存储读取教程【实用】

iPhone 15无法识别Type-C U盘需排查转接协议、文件格式(仅exFAT/FAT32)、MFi认证、USB受限模式及供电不足;推荐使用苹果USB-C相机套件或SMB网络共享方案解决。 如果您已拥有iPhone 15,却发现无法直接识别Type-C接口U盘——如无弹窗提示、文件App中不显示“外部驱动器”、仅供电不读取数据或写入失败,这通常源于转接协议缺失、U盘格式不兼容、供电不足或系统权...

Figma Dev Mode如何读取Tailwind配置_通过插件扩展Inspect功能

Figma Dev Mode中Inspect面板未正确生成Tailwind类名时,可通过四种方法解决:一、用Code Snippet Editor插件配合命名规范与映射模板;二、开发自定义插件读取远程tailwind-config.json并注入Inspect;三、借助Tailwind CSS Palette插件同步配置至Figma变量后引用;四、修改code-snippet-editor源码集成...
· AI · 206915

OpenClaw如何读取Word文档_用OpenClawAI快速总结Word内容【文档总结】

OpenClaw读取并总结Word文档依靠直接解析.docx内部XML结构,无需启动Word程序;通过summarize技能调用Qwen/DeepSeek模型生成结构化摘要,支持多格式指令与风格记忆,全程后台静默执行。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ OpenClaw 读取并总结 Word 文档,靠的不是“打开 Word 看一...

如何让 Nim 游戏中的 CPU 智能地选取合法数量的火柴棒

本文详解如何修正 python 版 nim 游戏中 cpu 随机取棒逻辑,避免越界(如从空行取棒或取超出剩余数量的棒),通过循环重试或预筛选策略实现安全、合法且符合游戏规则的 ai 行为。 本文详解如何修正 python 版 nim 游戏中 cpu 随机取棒逻辑,避免越界(如从空行取棒或取超出剩余数量的棒),通过循环重试或预筛选策略实现安全、合法且符合游戏规则的 ai 行为。 在 Nim 游戏中,...
· Python · 278673

PS如何快速提取相似颜色区域_选取相似命令实战【效率】

Photoshop中快速提取相似颜色区域有三种方法:一、魔棒工具单击提取,需取消“连续”并设容差30–60;二、“色彩范围”命令可视化采样,支持多点取色与灰度预览;三、“选取相似”命令跨图层匹配,可配合图层可见性控制精准分层提取。 如果您在Photoshop中需要快速提取图像中所有与指定位置颜色相似的区域,但手动圈选或逐点调整效率低下,则可能是由于未启用基于色彩分布的批量识别机制。以下是实现该目标...