python 使用pandas或xlrd、xlwt实现对Excel的读取、添加、追加等一系列封装

news2024/11/25 19:25:01

不说了,又是造轮子的一天。在此我要严重批评CSDN或百度一堆浑水摸鱼的,某些人明明代码明显报错也来上传发博客,要么就是标题党,代码没报错但压根就不是实现那个功能的,简直是浪费时间。

废话不多说直接贴代码:

保存追加那一块,我把他变成一列一列地添加,你可以把对应的转换给注释掉就行。使用xlrd、xlwt:

import xlrd
import xlwt
import xlutils.copy


class XLSX:
    __workbook = xlwt.Workbook(encoding='utf-8')
    __sheet = __workbook.add_sheet('Sheet1', cell_overwrite_ok=True)

    # 保存
    def save(self, name, head_list, data_list):
        path = './data/' + name + '.xlsx'
        head = head_list
        data = data_list
        __row = 0
        __col = 0
        for head in head:
            self.__sheet.write(__row, __col, head)
            __col = __col + 1
        for i in range(0, len(data)):
            for j in range(1, len(data[i]) + 1):
                self.__sheet.write(j, i, data[i][j - 1])
        self.__workbook.save(path)

    # 在原来的基础上增加 n 列,包含表头
    @staticmethod
    def save_append_col(name, data_list, head):
        path = './data/' + name + '.xlsx'
        file = xlrd.open_workbook(path)
        table = file.sheet_by_index(0)
        col_len = table.ncols
        ws = xlutils.copy.copy(file)
        ws_table = ws.get_sheet(0)
        ws_table.write(0, col_len, head)
        for i in range(1, len(data_list) + 1):
            ws_table.write(i, col_len, data_list[i - 1])
        ws.save(path)

    # 在原来的基础上增加 n 行,这里是按照每一列的方式追加
    @staticmethod
    def save_append_row(name, data_list):
        path = './data/' + name + '.xlsx'
        file = xlrd.open_workbook(path)
        table = file.sheet_by_index(0)
        row_len = table.nrows
        col_len = table.ncols
        ws = xlutils.copy.copy(file)
        ws_table = ws.get_sheet(0)
        for i in range(1, len(data_list)):
            for j in range(0, col_len):
                ws_table.write(row_len + i, j, data_list[i - 1][j])
        ws.save(path)

    # 获取文件所有数据,以列的方式
    @staticmethod
    def get_all_line(file_name):
        file = xlrd.open_workbook('./data/' + file_name + '.xlsx')
        table = file.sheets()[0]
        a = []
        for i in range(1, table.nrows):
            a.append(table.row_values(i))
        return a

    # 获取文件所有数据,以行的方式
    @staticmethod
    def get_all_line_col(file_name):
        file = xlrd.open_workbook('./data/' + file_name + '.xlsx')
        sheet = file.sheet_by_index(0)  # 获取第一个表格
        result = []
        rows = sheet.nrows
        for row_idx in range(rows):
            row_values = sheet.row_values(row_idx)
            result.append(row_values)
        return result

    # 获取文件指定一列的所有数据
    @staticmethod
    def get_all_col(file_name, col_index):
        file = xlrd.open_workbook('./data/' + file_name + '.xlsx')
        table = file.sheets()[0]
        a = []
        for i in range(1, table.nrows):
            a.append(table.row_values(i)[col_index])
        return a

    # 获取文件指定一行的所有数据
    @staticmethod
    def get_one_line(file_name, line_count):
        file = xlrd.open_workbook('./data/' + file_name + '.xlsx')
        t1 = file.sheets()[0]
        return t1.row_values(line_count)

    # 获取文件指定一行的指定一列的数据
    @staticmethod
    def get_one_line_col(file_name, line_count, col_count):
        file = xlrd.open_workbook('./data/' + file_name + '.xlsx')
        t1 = file.sheets()[0]
        return t1.row_values(line_count)[col_count]

    # 获取文件总行数
    @staticmethod
    def get_row_length(file_name):
        file = xlrd.open_workbook('./data/' + file_name + '.xlsx')
        table = file.sheet_by_index(0)
        return table.nrows

    # 获取总列数
    @staticmethod
    def get_col_length(file_name):
        file = xlrd.open_workbook('./data/' + file_name + '.xlsx')
        table = file.sheet_by_index(0)
        return table.ncols


# 测试
# xx = XLSX()
# xx.save('ddd', ['表头1', '表头2', '表头3'],
#         [['列1-第1行', '列1-第2行', '列1-第3行'], ['列2-第1行', '列2-第2行', '列2-第3行'],
#          ['列3-第1行', '列3-第2行', '列3-第3行']])
# xx.save_append_row('ddd', [['列1-第1行', '列1-第2行', '列1-第3行'], ['列2-第1行', '列2-第2行', '列2-第3行'],
#          ['列3-第1行', '列3-第2行', '列3-第3行']])
# xx.save_append_col('ddd', ['列4-第1行', '列4-第2行', '列4-第3行'], '表头4')
# print(xx.get_all_line('ddd'))
# print(xx.get_one_line('ddd', 2))
# print(xx.get_all_col('ddd', 3))
# print(xx.get_one_line_col('ddd', 1, 0))
# print(xx.get_row_length('ddd'))
# print(xx.get_col_length('ddd'))

使用pandas:

import os
import numpy as np
import pandas as pd


class EXCEL:

    # 保存
    @staticmethod
    def save(name, head_list, data_list):
        path = r'./data/' + name + '.xlsx'
        temp = {}
        for i in range(len(head_list)):
            temp[str(head_list[i])] = data_list[i]
        data = pd.DataFrame(temp)
        data.to_excel(path, index=False)

    # 在原来的基础上增加一个sheet表
    @staticmethod
    def append_sheet(name, sheet_name, head_list):
        write = pd.DataFrame(columns=head_list)
        path = r'./data/' + name + '.xlsx'
        if not os.path.exists(path):
            write = pd.ExcelWriter(path, engine='openpyxl')
        with pd.ExcelWriter(path, mode='a', engine='openpyxl') as writer:
            write.to_excel(writer, sheet_name=sheet_name, index=False)

    # 在原来的基础上增加 n 行,包含表头,这里是按照每一列的方式追加
    @staticmethod
    def append_row(name, head_list, data_list):
        path = r'./data/' + name + '.xlsx'
        temp = {}
        for i in range(len(head_list)):
            temp[str(head_list[i])] = data_list[i]
        old_data = pd.read_excel(path)
        new_data = pd.DataFrame(temp)
        result = pd.concat([old_data, new_data])
        result.to_excel(path, index=False)

    # 在原来的基础上增加 n 列
    @staticmethod
    def append_col(name, head_name, data_list):
        path = r'./data/' + name + '.xlsx'
        df = pd.read_excel(path)
        new_col = pd.Series(data_list)
        new_col.name = head_name
        result = pd.concat([df, new_col], axis=1)
        result.to_excel(path, header=True, index=False)

    # 获取文件所有数据,以行的方式
    @staticmethod
    def get_all_line(file_name):
        path = r'./data/' + file_name + '.xlsx'
        df = pd.read_excel(path)
        return df.values.tolist()

    # 获取文件所有数据,以列的方式
    @staticmethod
    def get_all_line_col(file_name):
        path = r'./data/' + file_name + '.xlsx'
        df = pd.read_excel(path)
        cols = df.columns.tolist()
        result = []
        for col in cols:
            result.append(df[col].values.tolist())
        return result

    # 获取文件指定一列的所有数据
    @staticmethod
    def get_all_col(file_name, col_index):
        path = r'./data/' + file_name + '.xlsx'
        df = pd.read_excel(path)
        col = df.iloc[:, col_index]
        return col.values.tolist()

    # 获取文件指定一行的所有数据
    @staticmethod
    def get_one_line(file_name, line_count):
        path = r'./data/' + file_name + '.xlsx'
        df = pd.read_excel(path)
        row = df.iloc[line_count]
        return row.values.tolist()

    # 获取文件指定一行的指定一列的数据
    @staticmethod
    def get_one_line_col(file_name, line_count, col_count):
        path = r'./data/' + file_name + '.xlsx'
        df = pd.read_excel(path)
        row = df.iloc[line_count]
        col = row[col_count]
        if isinstance(col, np.float64):
            col = pd.Series(col)
        return col

    # 获取文件总行数
    @staticmethod
    def get_row_length(file_name):
        path = r'./data/' + file_name + '.xlsx'
        df = pd.read_excel(path)
        total_rows = df.shape[0]
        return total_rows

    # 获取文件总列数
    @staticmethod
    def get_col_length(file_name):
        path = r'./data/' + file_name + '.xlsx'
        df = pd.read_excel(path)
        total_cols = df.shape[1]
        return total_cols


# 测试
# ee = EXCEL()
# ee.save('ggg', ['表头1', '表头2', '表头3'],
#         [['列1-第1行', '列1-第2行', '列1-第3行'], ['列2-第1行', '列2-第2行', '列2-第3行'],
#          ['列3-第1行', '列3-第2行', '列3-第3行']])
#
# ee.append_sheet('ggg', 'Sheet2', ['表头1', '表头2', '表头3'])
#
# ee.append_row('ggg', ['表头1', '表头2', '表头3'],
#               [['列1-第1行', '列1-第2行'], ['列2-第1行', '列2-第2行'], ['列3-第1行', '列3-第2行']])
#
# ee.append_col('ggg', '表头4', ['列4-第1行', '列4-第2行', '列4-第3行'])
#
# print(ee.get_all_line('ggg'))
# print(ee.get_one_line('ggg', 2))
# print(ee.get_all_col('ggg', 3))
# print(ee.get_one_line_col('ggg', 1, 0))
# print(ee.get_row_length('ggg'))
# print(ee.get_col_length('ggg'))

最后我想说:


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux—网络基础

目录 计算机网络背景 网络发展 认识 "协议" 网络协议初识 协议分层 OSI七层模型 TCP/IP五层(或四层)模型 网络传输基本流程 协议报头 局域网通信 网络传输流程图 局域网通信图 跨网络通信图 数据包封装和分用 网络中的地址管理 认识IP地址 认识MAC地址…

8款主流产品原型设计软件分享

在产品设计中,你知道如何选择合适的产品设计软件吗?每个产品设计软件的功能实际上是不同的,不同的产品设计软件应用领域是不同的。 只有深入了解每个产品设计软件的功能和主要适合该软件的行业,我们才能在设计相应的产品时找到合…

linux内核篇-进程及其调度

介绍一个程序从源文件到进程执行的过程 1、编译链接(源文件到二进制文件) Linux 下面二进制的程序也要有严格的格式,称为ELF(Executeable and Linkable Format,可执行与可链接格式) ,这个格式可…

Simulink 和 Gazebo联合仿真控制机械臂【Matlab R2022a】

逛 B 站,偶然发现一个 up 主上传的视频,可以实现 Simulink 中搭建机器人的控制器设计,对运行在虚拟机中 Gazebo 中的机械臂进行控制,链接:三关节机械臂Gazebo-Simulink联合仿真,这让我很感兴趣,…

Web基础 ( 一 ) HTML

1.HTML <input /><input typebutton value按钮 />1.1.概念 1.1.1.HTML文件是什么 HTML表示超文本标记语言&#xff08;Hyper Text Markup Language&#xff09;, HTML文件是一个包含标记的文本文件, 必须有htm标记或者html扩展名。 可以通过浏览器(Browser)直接…

如何用自己公司的知识、流程等来训练Chat GPT?

在玩过 ChatGPT 并向它询问有关世界、金融和初创公司的一般问题后&#xff0c;我开始思考&#xff1a;“如果我可以用我自己的初创公司甚至大型公司的所有流程、知识和商业经验来训练 AI 模型会怎样&#xff1f;企业&#xff1f;” 使用您自己公司的知识、流程等培训 ChatGPT …

华为OD机试 - 计算网络信号、信号强度( Python)

题目描述 网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。 注意:网络信号可以绕过阻隔物。 array[m][n] 的二维数组代表网格地图, array[i][j] = 0代表i行j列是空旷位置; array[i][j] = x(x为正整数)代表i行j列是信号源,…

Python实现哈里斯鹰优化算法(HHO)优化XGBoost回归模型(XGBRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO)&#xff0c;该算法有较强的全…

【A*算法——清晰解析 算法逻辑——算法可以应用到哪些题目】例题1.第K短路

A*算法 A*算法是什么例题1. 第K短路题意解析 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示…

栈和队列的实现

栈 栈的概念 栈也是线性表的一种&#xff0c;但是栈只允许在固定的一端进行插入与删除数据&#xff0c;而进行插入与删除的一端同意称为栈顶&#xff0c;而另一端就称为栈底。简称&#xff1a;后进先出。 压栈&#xff08;push&#xff09;&#xff1a;将数据插入栈顶。 出…

C++进阶——AVL树的构建

C进阶——AVL树的构建 AVL树 概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当 于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landi…

2023Python最火的第三方开源测试框架 ——pytest

一、介绍 本篇文章是介绍的是Python 世界中最火的第三方单元测试框架&#xff1a;pytest。 它有如下主要特性&#xff1a; assert 断言失败时输出详细信息&#xff08;再也不用去记忆 self.assert* 名称了&#xff09;自动发现测试模块和函数模块化夹具用以管理各类测试资源对…

顺序表,让数据有序飞舞:C语言实现全攻略

本篇博客会讲解顺序表这种数据结构的相关知识&#xff0c;并且使用C语言实现一个顺序表。 概述 什么是顺序表呢&#xff1f;顺序表是一种线性的数据结构&#xff0c;其特点是&#xff1a;数据是从第一个位置开始&#xff0c;连续存放的。其实&#xff0c;你完全可以把它等价于…

哈工大软件过程与工具作业3

哈尔滨工业大学 计算学部/软件学院 2022年秋季学期 2020级本科《软件过程与工具》课程&#xff08;3.0学分&#xff09; 作业报告 作业3&#xff1a;软件测试报告 姓名 学号 联系方式 石卓凡 120L021011 944613709qq.com/18974330318 目 录 1 作业目的与要求...........…

《计算机网络—自顶向下方法》 Wireshark实验(七):以太网与ARP协议分析

1 以太网 1.1 介绍 以太网是现实世界中最普遍的一种计算机网络。以太网有两类&#xff1a;第一类是经典以太网&#xff0c;第二类是交换式以太网&#xff0c;使用了一种称为交换机的设备连接不同的计算机。 经典以太网&#xff1a;是以太网的原始形式&#xff0c;运行速度从 …

股价与期待值“背道而驰”,友车科技能否站稳科创板?

上周&#xff0c;共计7只新股登陆A股&#xff0c;其中&#xff0c;用友汽车信息科技&#xff08;上海&#xff09;股份有限公司&#xff08;以下简称友车科技&#xff09;于5月11日在科创板上市。发行价为33.99元&#xff0c;发行3607.94万股&#xff0c;募资总额为12.24亿元。…

jmeter接口测试项目实战详解,零基础也能学,源码框架都给你

目录 1.什么是jmeter&#xff1f; 2.jmeter能做什么&#xff1f; 3.jmeter环境搭建 3.1前提&#xff1a; 3.2jmeter下载&#xff1a; 3.3jmeter环境搭建&#xff1a; 3.3.1mac当中jmeter环境搭建&#xff1a; 3.4jmeter基本配置 3.4.1.切换语言 3.4.2.安装插件 4.jmet…

MySQL数据库基础2

文章目录 数据类型表的约束 数据类型 1、数值类型&#xff1a;BIT、TINYINT、BOOL、SMALLINT、INT、BIGINT、FLOAT[(M,D)]、DOUBLE[(M,D)]、DECIMAL[(M,D)] FLOAT[(M,D)]&#xff1a;占用四个字节&#xff0c;M表示显示位数&#xff0c;D表示小数位数&#xff0c;精度保证&am…

5年测试,已失业3个月.....

我做测试5年&#xff0c;一线城市薪水拿到15K&#xff0c;中间还修了一个专升本&#xff0c;这个年限不说资深肯定也是配得上经验丰富的。今年行情不好人尽皆知&#xff0c;但我还是对我的薪水不是很满意&#xff0c;于是打算出去面试&#xff0c;希望可以搏一个高薪。 但真到面…

测试自动化工具_Katalon

测试自动化_Katalon 1.概述 ​ Katalon界面的自动化测试工具&#xff0c;简称KS&#xff0c;于2015年推出。是开源的&#xff0c;提供的版本有免费的版本&#xff0c;还有企业版是收费的。如下图。其中的服务台功能应该是持续继承的支持。可试用一个月。 ​ 最初是支持Web UI…