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

 更新时间:2025年02月11日 10:45:03   作者:一晌小贪欢  
这篇文章主要为大家详细介绍了通过Python和pyqt5设计一个工具,可以实现pandas读取Excel选取列作为键或值转json,感兴趣的小伙伴可以了解下

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的资料请关注脚本之家其它相关文章!

相关文章

  • 只用50行Python代码爬取网络美女高清图片

    只用50行Python代码爬取网络美女高清图片

    第一次写文章,技术不成熟之处望各位大神轻喷,今天教大家只用50行Python代码爬取网络美女图片是怎么操作的,文中有非常详细的代码示例,对正在学习python的小伙伴们很有帮助哦,需要的朋友可以参考下
    2021-06-06
  • Python中的闭包总结

    Python中的闭包总结

    这篇文章主要介绍了Python中的闭包总结,本文讲解了闭包的概念、为什么使用闭包、使用闭包实例等内容,需要的朋友可以参考下
    2014-09-09
  • django之使用celery-把耗时程序放到celery里面执行的方法

    django之使用celery-把耗时程序放到celery里面执行的方法

    今天小编就为大家分享一篇django之使用celery-把耗时程序放到celery里面执行的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • python 制作网站小说下载器

    python 制作网站小说下载器

    这篇文章主要介绍了python 如何制作网站小说下载器,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2021-02-02
  • 在Python中计算移动平均值的方法

    在Python中计算移动平均值的方法

    在这篇文章中,我们将看到如何在Python中计算移动平均值,移动平均是指总观测值集合中固定大小子集的一系列平均值,它也被称为滚动平均,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-10-10
  • python实现比较两段文本不同之处的方法

    python实现比较两段文本不同之处的方法

    这篇文章主要介绍了python实现比较两段文本不同之处的方法,涉及Python针对文本与字符串的相关操作技巧,需要的朋友可以参考下
    2015-05-05
  • Python中str.format()和f-string的使用

    Python中str.format()和f-string的使用

    本文主要介绍了Python中str.format()和f-string的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Python图形化界面基础篇之如何使用弹出窗口和对话框

    Python图形化界面基础篇之如何使用弹出窗口和对话框

    对于Python程序员来说,处理弹出窗口似乎并不是一个常见的任务,这篇文章主要给大家介绍了关于Python图形化界面基础篇之如何使用弹出窗口和对话框的相关资料,需要的朋友可以参考下
    2024-03-03
  • Python3中的指针你了解吗

    Python3中的指针你了解吗

    Python这个编程语言虽然没有指针类型,但是Python中的可变参量也可以像指针一样,改变一个数值之后,所有指向该数值的可变参量都会随之而改变,这篇文章主要介绍了Python3中的“指针”,需要的朋友可以参考下
    2024-02-02
  • Python Requests库知识汇总

    Python Requests库知识汇总

    这篇文章主要介绍了Python Requests库学习总结,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05

最新评论