超简单:用Python让Excel飞起来

王秀文 郭明鑫 王宇韬

1.3.1 初识模块

  • 每一个以“.py”为扩展名的文件都可以称为一个模块。
  • 本书中讲到的xlwings模块就是专门用于控制Excel的模块。
  • 第三方模块在使用前一般需要用户自行安装,而有些第三方模块会在安装编辑器(如PyCharm)时自动安装好。
  • 自定义模块不能和内置模块重名,否则将不能再导入内置模块。

1.3.2 模块的安装

  • 模块有两种常用的安装方式:一种是使用pip命令安装;一种是通过编辑器(如PyCharm)安装。
  • pip是Python官方的编程环境提供的一个命令,主要功能就是安装和卸载第三方模块。
  • 输入命令“pip install xlwings”

2.1 变量

  • 首先要为变量起一个名字,称为变量的命名;然后要为变量指定其所代表的数据,称为变量的赋值
  • 变量名可以由任意数量的字母、数字、下划线组合而成,但是必须以字母或下划线开头,不能以数字开头。
  • 不要用Python的关键字或内置函数来命名变量
  • 变量名对英文字母区分大小写
  • 建议使用英文字母和数字来组成变量名,并且变量名要有一定的意义,能够直观地描述变量所代表的数据内容

2.2 数据类型:数字与字符串

  • 数字、字符串、列表、字典、元组和集合

2.2.1 数字

  • 整型的英文为integer,简写为int。

2.2.2 字符串

  • 引号可以是单引号、双引号或三引号,且必须是英文状态下的引号。字符串的英文为string,简写为str。
  • 三引号中的字符串内容是可以换行的。如果只想使用单引号或双引号来定义字符串,但又想在字符串中换行,可以使用转义字符\n,
  • 反斜杠+想要实现的转义功能首字母
  • 第1行代码通过在字符串的前面增加一个字符r来取消转义字符\n的换行功能;第2行代码则是将路径中的“\”改为“\\”,“\\”也是一个转义字符,它代表一个反斜杠字符“\”。

2.2.3 数据类型的查询

  • 使用Python内置的type()函数来查询数据的类型。

2.2.4 数据类型的转换

  • str()函数、int()函数和float()函数来实现。
  • str()函数能将数据转换成字符串
  • 需要注意的是,内容不是标准整数的字符串,如'C-3PO'、'3.14'、'98%',不能被int()函数正确转换。
  • 浮点型数字也可以被int()函数转换为整数,转换过程中的取整处理方式不是四舍五入,而是直接舍去小数点后面的数,只保留整数部分。
  • 整型数字和内容为整数的字符串在用float()函数转换后会在末尾添加小数点和一个0。

2.3.1 列表

  • 列表的元素可以是字符串,也可以是数字,甚至可以是另一个列表。
  • 利用for语句可以遍历列表中的所有元素
  • 如果需要统计列表的元素个数(又叫列表的长度),可以使用len()函数。
  • Python中序号都是从0开始的,所以class1[0]才是提取'丁一
  • 其中,序号1的元素可以提取到,而序号2的元素则提取不到,俗称“左闭右开”
  • 用append()函数可以给列表添加元素
  • 将列表转换成字符串主要用的是join()函数
  • 将字符串转换为列表主要用的是split()函数

2.3.2 字典

  • 字典的每个元素都由两个部分组成(而列表的每个元素只有一个部分),前一个部分称为键,后一个部分称为值,中间用冒号相连。
  • 另一种遍历字典的方法是用字典的items()函数

2.3.3 元组和集合

  • 定义列表的符号是中括号[],而定义元组的符号是小括号(),并且元组中的元素不可修改
  • 集合是一个无序的不重复序列,也就是说,集合中不会有重复的元素。可使用大括号{}来定义集合,也可使用set()函数来创建集合

2.4 运算符

  • 常用的运算符有算术运算符、字符串运算符、比较运算符、赋值运算符和逻辑运算符。

2.4.1 算术运算符和字符串运算符

  • +”用于拼接字符串,“*”用于将字符串复制指定的份数

2.5.2 注释

  • 单行注释以“#”号开头
  • 单行注释放在被注释代码上方时,在“#”号之后先输入一个空格,再输入注释内容。·单行注释放在被注释代码后时,“#”号和代码之间至少要有两个空格,“#”号与注释内容之间也要有一个空格。
  • 在Python中,使用3个单引号或3个双引号将多行注释的内容括起来。

2.6 控制语句

  • 条件语句是指if语句,循环语句是指for语句和while语句

2.6.2 for语句

  • for语句常用于完成指定次数的重复操作
  • 如果序列是一个字符串,则i代表字符串中的字符;如果序列是一个字典,则i代表字典的键名
  • 编程中还常用range()函数来创建一个整数序列
  • range()函数创建的序列默认从0开始,并且该函数具有与列表切片类似的“左闭右开”特性

2.6.3 while语句

  • while语句用于在指定条件成立时重复执行操作
  • while语句经常与True搭配使用来创建永久循环
  • 如果想强制停止永久循环,在IDLE中可以按快捷键【Ctrl+C】,在PyCharm中可以按快捷键【Ctrl+F2】

2.7 函数

  • 函数就是把具有独立功能的代码块组织成一个小模块,在需要时直接调用

2.7.1 内置函数

  • 可以统计列表的元素个数
  • len()函数还可以统计字符串的长度
  • replace()函数主要用于在字符串中进行查找和替换
  • strip()函数的主要作用是删除空白符(包括换行符和空格)
  • split()函数的主要作用是按照指定的分隔符将字符串拆分为一个列表

2.7.2 自定义函数

  • 在Python中使用def语句来定义一个函数,基本语法格式如下,注意不要遗漏冒号及缩进。
  • 如果之后还需要使用函数的执行结果做其他事,则在定义函数时要使用return语句来定义函数的返回值。
  • 函数内使用的变量与函数外的代码是没有关系的
  • 函数的形式参数只是一个代号,属于函数内的局部变量,因此不会影响函数外部的变量。

第3章 Python模块

  • os、xlwings、NumPy、pandas、Matplotlib

3.1.1 import语句导入法

  • 用该方法导入模块后,在后续编程中如果要调用模块中的函数,则要在函数名前面加上模块名的前缀。

3.1.2 from语句导入法

  • 有些模块中的函数特别多,用import语句全部导入后会导致程序运行速度较慢,将程序打包后得到的文件体积也会很大。如果只需要使用模块中的少数几个函数,就可以采用from语句导入法,这种方法可以指定要导入的函数。
  • 使用该方法导入模块的最大优点就是在调用函数时可以直接写出函数名,无须添加模块名前缀。
  • 如果模块名或函数名很长,可以在导入时使用as关键字对它们进行简化,以方便后续代码的编写。
  • 使用from语句导入法时,如果将函数名用通配符“*”代替,写成“from 模块名 import *”,则和import语句导入法一样,会导入模块中的所有函数。

3.2 处理文件和文件夹的模块——os

  • os模块是Python和操作系统进行交互的一个接口,它提供了许多操作文件及文件夹的函数。

3.2.1 获取当前运行的Python代码文件路径

  • 要获取当前运行的Python代码文件的路径(即该文件的保存位置),可以用os模块中的getcwd()函数来实现。

3.2.2 列出指定路径下的文件夹包含的文件和子文件夹名称

  • 如果要查看某个文件夹包含的所有文件和子文件夹的名称,可以使用os模块中的listdir()函数。

3.2.3 分离文件主名和扩展名

  • 如果要分离一个文件的文件主名和扩展名,可以使用splitext()函数

3.2.4 重命名文件和文件夹

  • os模块中的rename()函数可以重命名文件和文件夹
  • rename()函数除了可以重命名文件,还可以修改文件的路径
  • 在对文件夹进行重命名时,只能重命名最后一级的文件夹,而不能像重命名文件那样移动位置。

3.3 批量处理Excel文件的模块——xlwings

  • 可以处理Excel文件的Python模块有很多,如XlsxWriter、xlrd、xlwt、xlutils、openpyxl和xlwings等
  • xlwings模块的功能是最齐全的。它不仅能读、写和修改两种格式的Excel文件(xls和xlsx),而且能批量处理多个Excel文件。

3.3.1 创建工作簿

  • 其中的App()是xlwings模块中的函数,该函数有两个常用参数:参数visible用于设置Excel程序窗口的可见性,如果为True,表示显示Excel程序窗口,如果为False,表示隐藏Excel程序窗口;参数add_book用于设置启动Excel程序窗口后是否新建工作簿,如果为True,表示新建一个工作簿,如果为False,表示不新建工作簿。

3.3.2 保存工作簿

  • save()函数用于保存前面创建的空白工作簿
  • 代码中的字符r用来取消路径中反斜杠“\”的转义功能
  • 相对路径:表示相对于当前运行的代码文件的路径

3.3.3 打开工作簿

  • 需要注意的是,指定的工作簿必须真实存在,并且不能处于已打开的状态。

3.3.4 操控工作表和单元格

  • 1 import xlwings as xw
2 app = xw.App(visible = False)
3 workbook = app.books.add()
4 worksheet = workbook.sheets.add('产品统计表')
5 worksheet.range('A1').value = '编号'
6 workbook.save(r'd:\北京.xlsx')
7 workbook.close()
8 app.quit()

3.4.1 数组的基础知识

  • array()是NumPy模块中的函数,用于创建数组
  • 数组中的元素用空格分隔,而列表中的元素用逗号分隔
  • 列表是把元素复制了一遍,而数组则是对每个元素都进行了乘法运算
  • 数组可以存储多维数据,而列表通常只能存储一维数据。

3.4.2 数组的创建

  • np.array(列表)
  • np.arange()函数来创建一维数组
  • np.random中的函数创建随机一维数组
  • 至于二维数组,可以利用创建一维数组的np.arange()函数和reshape()函数来创建
  • np.random.randint()函数用来创建随机整数

3.5 数据导入和整理模块——pandas

  • pandas模块是基于NumPy模块的一个开源Python模块,广泛应用于完成数据快速分析、数据清洗和准备等工作,它的名字来源于“panel data”(面板数据)
  • pandas模块更擅长处理二维数据,其主要有Series和DataFrame两种数据结构。
  • DataFrame是一种二维表格数据结构,可以将其看成一个Excel表格

3.5.1 二维数据表格DataFrame的创建与索引的修改

  • DataFrame可以通过列表、字典或二维数组创建
  • DataFrame更像Excel中的二维表格,它也有行索引和列索引。
  • 参数columns用于指定列索引名称,参数index用于指定行索引名称
  • 通过字典创建DataFrame,默认以字典的键名作为列索引
  • 如果想以字典的键名作为行索引,可以用from_dict()函数将字典转换成DataFrame,同时设置参数orient的值为'index'。
  • 参数orient用于指定以字典的键名作为列索引还是行索引,默认值为'columns',即以字典的键名作为列索引,如果设置成'index',则表示以字典的键名作为行索引。
  • 通过设置index.name属性的值可以修改行索引那一列的名称
  • 如果想重命名索引,可以使用rename()函数
  • rename()函数会用新索引名创建一个新的DataFrame,并不会改变a的内容,所以这里将重命名索引之后得到的新DataFrame赋给a,以便在后续代码中使用。
  • 如果想将行索引转换为常规列,可以用reset_index()函数重置索引

3.5.2 文件的读取和写入

  • ·sheetname用于指定工作表,可以是工作表名称,也可以是数字(默认为0,即第1个工作表)。
  • CSV文件本质上是一个文本文件,它仅存储数据,不能像Excel工作簿那样存储格式、公式、宏等信息,所以所占存储空间通常较小。

3.5.3 数据的选取和处理

  • 如果要选取多列,则需在中括号[]中以列表的形式给出列索引。
  • pandas模块的官方文档推荐使用iloc方法来根据行序号选取数据
  • 除了根据行序号选取数据外,还可以使用loc方法根据行的名称来选取数据
  • 如果行数很多,可以用head()函数选取前5行数据
  • 在实战中选取区块数据时,通常先用iloc方法选取行,再选取列
  • loc方法使用字符串作为索引,iloc方法使用数字作为索引。有个简单的记忆方法:loc是location(定位、位置)的缩写,所以是用字符串作为索引;iloc中多了一个字母i,而i又经常代表数字,所以是用数字作为索引。
  • 如果有多个筛选条件,可以用“&”(表示“且”)或“|”(表示“或”)连接起来。
  • 使用sort_values()函数可以按列对数据进行排序
  • 使用sort_index()函数可以按行索引进行排序。
  • 使用drop()函数可以删除DataFrame中的指定数据
  • 需要注意的是,给出行索引时要输入行索引名称而不是数字序号,除非行索引名称本来就是数字。

3.5.4 数据表的拼接

  • merge()函数、concat()函数、append()函数
  • merge()函数可以根据一个或多个同名的列将不同数据表中的行连接起来
  • 如果同名的列不止一个,可以通过设置参数on指定按照哪一列进行合并
  • 默认的合并方式其实是取交集(inner连接),即选取两个表共有的内容。如果想取并集(outer连接),即选取两个表所有的内容,可以设置参数how
  • 如果想保留左表(df1)的全部内容,而对右表(df2)不太在意,可以将参数how设置为'left'
  • concat()函数使用全连接(UNION ALL)方式完成拼接,它不需要对齐,而是直接进行合并,即不需要两个表有相同的列或索引,只是把数据整合到一起

3.6 数据可视化模块——Matplotlib

  • plt.plot()函数用于绘制折线图,plt.bar()函数用于绘制柱形图,plt.pie()函数用于绘制饼图

3.7.2 xlwings模块与Matplotlib模块的交互

  • worksheet.pictures.add()函数可以将Matplotlib模块绘制的图表写入工作簿

案例01 批量新建并保存工作簿

  • f-string方法。该方法以f或F修饰符引领字符串,然后在字符串中以大括号{}标明被替换的内容。使用该方法无须事先转换数据类型就能将不同类型的数据拼接成字符串

案例02 批量打开一个文件夹下的所有工作簿

  • splitext()函数用于分离文件主名和扩展名

案例04 批量重命名多个工作簿

  • startswith()是Python内置的字符串函数,用于判断字符串是否以指定的子字符串开头
  • os.path.join()是os模块中的函数,用于把文件夹名和文件名拼接成一个完整路径

案例06 批量打印工作簿

  • 利用工作簿对象的api属性调用VBA的PrintOut()函数来打印工作簿

案例07 将一个工作簿的所有工作表批量复制到其他工作簿

  • expand()是xlwings模块中的函数,用于扩展选择范围