18.使用读写包操作Excel文件:xlrd、xlwt 和 xlutils 包

一 xlrd、xlwt 和 xlutils 包的介绍

OpenPyXL 和 xlrd、xlwt 、xlutils 的区别在笔记 15 。


二 如何使用 xlrd 读取文件

1.获取所有工作表的名称

book.sheet_names():得到一个列表。

import xlrd
import xlwt
from xlwt.Utils import cell_to_rowcol2
import xlutils
import excelbook = xlrd.open_workbook("xl/stores.xls")
print(book.sheet_names())for sheet in book.sheets():print(sheet.name)

2.获取工作表对象

通过名称或者索引(从0开始)。

sheet = book.sheet_by_index(0)
sheet = book.sheet_by_name("2019")

3.获取工作表维度

print(sheet.nrows)
print(sheet.ncols)

补充:xlrd 在处理 Excel 文件时,使用 sheet.nrows 和 sheet.ncols 属性来获取工作表的总行数和总列数,而这些值反映的是工作表的实际维度,而不是 "使用区域"(used range)的维度。在 Excel 中,"使用区域" 是指包含数据的矩形区域。它排除了不包含数据的空行和空列。

sheet.nrows 返回工作表中的总行数。

sheet.ncols 返回工作表中的总列数。

这些值表示整个工作表的大小,包括可能存在的空行和空列。

如果你只关心包含数据的区域,而忽略空行和空列,你可能需要手动计算"使用区域"。这可以通过检查每行和每列是否有数据来实现。例如,遍历所有行和列,找到第一个和最后一个包含数据的行和列,以确定实际使用的区域。

4.使用A1表示法或者单元格索引(从0开始)读取各个单元格的值

sheet.cell(*cell_to_rowcol2("B3")).value
sheet.cell(2, 1).value
sheet.cell(*cell_to_rowcol2("B3")).value:

cell_to_rowcol2("B3"):用于将 Excel 风格的单元格地址(如 "B3") 转换为行号和列号的元组 (row, col)"B3" 会被转换为 (2, 1)。

*cell_to_rowcol2("B3"):* 是解包操作符,用于将元组 (2, 1) 解包为两个独立的参数 2 和 1

sheet.cell(2, 1).value: 获取指定单元格的值。.value 属性返回单元格中的内容。

sheet.cell(2, 1) 获取第 3 行(索引 2)第 2 列(索引 1)的单元格对象。

5.使用 excel 模块读取一个区间中单元格的值

data = excel.read(sheet, "B2")
data[:2] # 打印前两行

6.处理大型文件

在读取旧式的 xls 格式的大型文件时,xlrd 可以按需加载工作表。

with xlrd.open_workbook("xl/stores.xls", on_demand=True) as book:sheet = book.sheet_by_index(0) # 只加载第一张工作表

with语句用于确保文件在使用完毕后能够被正确关闭。book变量代表打开的工作簿对象。

on_demand=True参数指定了按需加载模式。在按需加载模式下,xlrd不会一次性将整个工作簿加载到内存中,加载特定的工作表或单元格数据。

sheet = book.sheet_by_index(0):使用 sheet_by_index方法从工作簿 book中获取了索引为0的工作表,并将其赋值给变量sheet。工作表的索引是从0开始的,所以sheet_by_index(0)返回的是第一个工作表。

需要注意的是,由于使用了按需加载模式,此时只有第一个工作表的数据被加载到了内存中。

搭配 pandas 在上下文管理器模式下使用 xlrd:
with xlrd.open_workbook("xl/stores.xls", on_demand=True) as book:with pd.ExcelFile(book, engine="xlrd") as f:df = pd.read_excel(f, sheet_name=0)

7.关闭工作簿

调用 book.release_ resources() 。


三 如何使用 xlwt 写入文件

xlwt 并不能生成图表,并且只支持 bmp 格式的图片。

1.导包

 import xlwtfrom xlwt.Utils import cell_to_rowcol2import datetime as dtimport excel

2.实例化工作簿

book = xlwt.Workbook()

3.添加工作表并为其命名

sheet = book.add_sheet("Sheet1")

4.使用A1表示法和单元格索引(从0开始)写入各个单元格

sheet.write(*cell_to_rowcol2("A1"), "Hello 1")
sheet.write(r=1, c=0, label="Hello 2")

在 xlwt 中,sheet.write() 方法用于向工作表的特定单元格写入数据。这个方法通常需要三个参数:行号 (r)、列号 (c)、以及要写入的数据 (label)。

sheet.write(*cell_to_rowcol2("A1"), "Hello 1"):这行代码的目的是将字符串 "Hello 1" 写入到单元格 A1。这里使用了 cell_to_rowcol2() 函数,该函数接受一个 Excel 单元格地址(如 "A1"),并返回一个包含行号和列号的元组。*cell_to_rowcol2("A1") 是解包操作,它将这个元组解包为两个独立的参数(行号和列号),然后传递给 sheet.write() 方法。

为什么有解包操作:

因为 sheet.write() 方法期望接收三个独立的参数:行号 (r)、列号 (c) 和要写入的数据 (label)。然而 cell_to_rowcol2() 函数返回的是一个包含两个元素的元组,这两个元素分别代表行号和列号。

def return_tuple():return (1, 2)# 不使用解包
a, b = return_tuple()  # a = 1, b = 2# 使用解包作为函数参数
def print_numbers(x, y):print(x, y)print_numbers(*return_tuple())  # 输出: 1 2

return_tuple 函数,该函数不接受任何参数,并返回一个包含两个整数 (1, 2) 的元组。通过调用 return_tuple() 函数,并将其返回值赋给两个变量 a 和 b,其中 a 被赋值为 1b 被赋值为 2

print_numbers 的函数,该函数接受两个参数 x 和 y,并将它们打印出来。解包操作允许我们将一个元组中的元素作为参数列表传递给另一个函数,而无需手动提取元组中的每个元素。

sheet.write(r=1, c=0, label="Hello 2"):这行代码直接将字符串 "Hello 2" 写入到第2行第1列的单元格中( r=1 表示第2行,c=0 表示第1列),label 参数指定了要写入的数据。

5.格式化:填充颜色、对齐、边框和字体

formatting = xlwt.easyxf("font: bold on, color red;""align: horiz center;""borders: top_color red, bottom_color red,""right_color red, left_color red,""left thin, right thin,""top thin, bottom thin;""pattern: pattern solid, fore_color yellow;")
sheet.write(r=2, c=0, label="Hello 3", style=formatting)

6.数字格式化(使用Excel的格式化字符串)

number_format = xlwt.easyxf(num_format_str="0.00")
sheet.write(3, 0, 3.3333, number_format)

7.日期格式化(使用Excel的格式化字符串)

date_format = xlwt.easyxf(num_format_str="mm/dd/yyyy")
sheet.write(4, 0, dt.datetime(2012, 2, 3), date_format)

8.使用公式

sheet.write(5, 0, xlwt.Formula("SUM(A4, 2)"))

9.二维列表(使用excel模块)

data = [[None, "North", "South"],["Last Year", 2, 5],["This Year", 3, 6]]
excel.write(sheet, data, "A10")

10.图片(只支持添加bmp格式的图片)

sheet.insert_bitmap("images/python.bmp", 0, 2)

11.将文件写入磁盘

book.save("xlwt.xls")


四 如何使用 xlutils 编辑文件

工作表通过 xlrd 读取包含格式在内的文件内容(将 formatting_info 的参数设置为 True),然后

再通过 xlwt 将其间做出的更改写入文件。

补充:formatting_info参数

formatting_info参数是一个可选参数,它用于指示在打开Excel文件时是否加载格式信息。

formatting_info=True时,xlrd会尝试读取并加载Excel文件中的格式信息,如字体、颜色、边框、对齐方式等。这可能会增加内存消耗,因为需要存储更多的格式数据。

formatting_info=False时,xlrd不会加载格式信息,只读取数据内容。这通常可以节省内存,并且对于只需要数据而不需要格式的应用场景来说足够了。

import xlutils.copy
book = xlrd.open_workbook("xl/stores.xls", formatting_info=True)
book = xlutils.copy.copy(book)
book.get_sheet(0).write(0, 0, "changed!")
book.save("stores_edited.xls")

book = xlutils.copy.copy(book):使用 xlutils.copy 模块的 copy 函数复制由 xlrd 打开的工作簿。这一步是必要的,因为xlrd打开的工作簿是只读的,而 xlutils.copy 提供了一个可写的工作簿副本。

book.get_sheet(0).write(0, 0, "changed!"):修改第一个工作表(索引为0)的第一个单元格(行0,列0)的内容为"changed!"。

book.save("stores_edited.xls"):尝试保存修改后的工作簿到名为 stores_edited.xls的文件。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

睡不着运动锻炼贴士

在快节奏的现代生活中,失眠似乎已成为许多人的“夜间伴侣”。夜晚辗转反侧,白天精神不振,这样的恶性循环让许多人苦不堪言。其实,除了调整作息和饮食习惯,适当的运动也是改善睡眠的一剂良药。今天,就让我们…

java数据结构(复杂度)

一.时间复杂度和空间复杂度 1.时间复杂度 衡量一个程序好坏的标准,除了能处理各种异常,还有就是时间效率,当然,对于一些配置好的电脑数据处理起来就是比配置低的高,但从后期发展来看,当数据量足够庞大时&…

NAT和NAPT的介绍

一、NAT的介绍以及作用 二、NAPT的介绍以及作用 三、NAT vs NAPT 一、NAT的介绍以及作用 1.1 NAT的介绍 NAT(Network Address Translation)是一种广泛应用于互联网的技术,主要用于解决IPv4地址耗尽问题,同时提供网络安全和网络…

VSCode通过SSH免密远程登录Windows服务器

系列 1.1 VSCode通过SSH远程登录Windows服务器 1.2 VSCode通过SSH免密远程登录Windows服务器 文章目录 系列1 准备工作2 本地电脑配置2.1 生成密钥2.2 VS Code配置密钥 3. 服务端配置3.1 配置SSH服务器sshd_config3.2 复制公钥3.3 配置权限(常见问题)3.…

大模型训练全流程深度解析

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。https://www.captainbed.cn/north 文章目录 1. 大模型训练概览1.1 训练流程总览1.2 关键技术指标 2. 数据准备2.1 数据收集与清洗2.2 数据…

export、export default 和 module.exports 深度解析

文章目录 1. 模块系统概述1.1 模块系统对比1.2 模块加载流程 2. ES Modules2.1 export 使用2.2 export default 使用2.3 混合使用 3. CommonJS3.1 module.exports 使用3.2 exports 使用 4. 对比分析4.1 语法对比4.2 使用场景 5. 互操作性5.1 ES Modules 中使用 CommonJS5.2 Com…

AI芯片设计

目的:未来的时代,一定会是AI的时代,那么,AI时代的三个重要组成部分,我要参与其中之一! 参考视频:AI芯片设计第一讲_哔哩哔哩_bilibili 端处理 云端

动手学深度学习:CNN和LeNet

前言 该篇文章记述从零如何实现CNN,以及LeNet对于之前数据集分类的提升效果。 从零实现卷积核 import torch def conv2d(X,k):h,wk.shapeYtorch.zeros((X.shape[0]-h1,X.shape[1]-w1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i,j](X[i:ih,j:jw…

【开源代码解读】AI检索系统R1-Searcher通过强化学习RL激励大模型LLM的搜索能力

关于R1-Searcher的报告: 第一章:引言 - AI检索系统的技术演进与R1-Searcher的创新定位 1.1 信息检索技术的范式转移 在数字化时代爆发式增长的数据洪流中,信息检索系统正经历从传统关键词匹配到语义理解驱动的根本性变革。根据IDC的统计…

使用Node的http模块创建web服务,给客户端返回html页面时,css失效的根本原因(有助于理解http)

最近正在尝试使用node写后端,使用node创建http服务的时候,碰到了这样的一个问题: 这是我的源代码: import { createServer } from http import { join, dirname, extname } from path import { fileURLToPath } from url import…

JVM 2015/3/15

定义:Java Virtual Machine -java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写,到处运行 自动内存管理,垃圾回收 数组下标越界检测 多态 比较:jvm/jre/jdk 常见的JVM&…

IP风险度自检,互联网的安全“指南针”

IP地址就像我们的网络“身份证”,而IP风险度则是衡量这个“身份证”安全性的重要指标。它关乎着我们的隐私保护、账号安全以及网络体验,今天就让我们一起深入了解一下IP风险度。 什么是IP风险度 IP风险度是指一个IP地址可能暴露用户真实身份或被网络平台…

【鸿蒙】封装日志工具类 ohos.hilog打印日志

封装一个ohos.hilog打印日志 首先要了解hilog四大日志类型: info、debug、warm、error 方法中四个参数的作用 domain: number tag: string format: string ...args: any[ ] 实例: //普通的info日志,使用info方法来打印 //第一个参数 : 0x0…

走路碎步营养补充贴士

走路碎步,这种步伐不稳的现象,在日常生活中并不罕见,特别是对于一些老年人或身体较为虚弱的人来说,更是一种常见的行走状态。然而,这种现象可能不仅仅是肌肉或骨骼的问题,它还可能是身体在向我们发出营养缺…

Python软件和搭建运行环境

目录 一、Python安装全流程(Windows/Mac/Linux) 1. 下载官方安装包 2. 详细安装步骤(以Windows为例) 3. 环境变量配置(Mac/Linux) 二、虚拟环境管理(关键!) 为什么需…

【蓝桥杯】省赛:神奇闹钟

思路 python做这题很简单,灵活用datetime库即可 code import os import sys# 请在此输入您的代码 import datetimestart datetime.datetime(1970,1,1,0,0,0) for _ in range(int(input())):ls input().split()end datetime.datetime.strptime(ls[0]ls[1],&quo…

RabbitMQ (Java)学习笔记

目录 一、概述 ①核心组件 ②工作原理 ③优势 ④应用场景 二、入门 1、docker 安装 MQ 2、Spring AMQP 3、代码实现 pom 依赖 配置RabbitMQ服务端信息 发送消息 接收消息 三、基础 work Queue 案例 消费者消息推送限制(解决消息堆积方案之一&#…

HW基本的sql流量分析和wireshark 的基本使用

前言 HW初级的主要任务就是看监控(流量) 这个时候就需要我们 了解各种漏洞流量数据包的信息 还有就是我们守护的是内网环境 所以很多的攻击都是 sql注入 和 webshell上传 (我们不管对面是怎么拿到网站的最高权限的 我们是需要指出它是…

camellia redis proxy v1.3.3对redis主从进行读写分离(非写死,自动识别故障转移)

1 概述 camellia-redis-proxy是一款高性能的redis代理(https://github.com/netease-im/camellia),使用netty4开发,主要特性如下: 支持代理到redis-standalone、redis-sentinel、redis-cluster。支持其他proxy作为后端…

贪吃蛇小游戏-简单开发版

一、需求 本项目旨在开发一个经典的贪吃蛇游戏,用户可以通过键盘控制蛇的移动方向,让蛇吃掉随机出现在游戏区域内的食物,每吃掉一个食物,蛇的身体长度就会增加,同时得分也会相应提高。游戏结束的条件为蛇撞到游戏区域的…