【目录】


【正文】

6. 使用python将多个Excel文件合并到同一个excel-附代码解析

1. 目标任务

某文件夹中有如下5个Excel:

在这里插入图片描述
在这里插入图片描述

销售表-1月.xlsx的内容如下:

在这里插入图片描述

5个Excel仅数据不一致,框架内容相同。

目标任务是将5个Excel合并成一个Excel。

2. 结果展示

在这里插入图片描述

3. 代码示例

源代码文件:6.合并多个Excel.py

import pandas as pd
import os
data_list = []

# os.listdir(".")返回目录中的文件名列表
# 用for循环遍历文件名列表中的每个文件名,赋值给变量filename
for filename in os.listdir("."):
    # 判断文件名是否以"销售表-"开头并且以".xlsx"结尾
    if filename.startswith("销售表-") and filename.endswith(".xlsx"):
        # pd.read_excel(filename)读取Excel文件,返回一个DataFrame对象
        # 列表名.append将DataFrame写入列表
        data_list.append(pd.read_excel(filename))

# concat合并Pandas数据
data_all =pd.concat(data_list)
# 将 DataFrame 保存为 excel 文件
data_all.to_excel("年度销售表.xlsx",index=False)

# 查看 DataFrame 的行数和列数。
rows = data_all.shape
print("查看行数与列数:", rows)
print("恭喜你,合并完成!")

【终端输出】

查看行数与列数: (25, 4)
恭喜你,合并完成!

4. 代码解析

4.1 导入库

import pandas as pd

导入pandas库,并将其别名设置为pd

as是一个关键字,用于给导入库指定一个别名。

别名的作用是引用pandas库中的函数和类,不必每次都写完整的pandas,可以用别名pd代替。

import os

导入os库,os库用于操作文件和目录。

data_list = []

创建一个空列表,用于存储后面读取的Excel数据。

4.2 调用库的类、函数、变量语法

  • 调用库的类:库名.类名( ),如 csv.DictReader()
  • 调用库的函数:库名.函数名( ),如 os.mkdir()
  • 调用库的变量:库名.变量名,如 os.name

【总结】

  • 不管调用什么,库名后都需要紧跟一个英文小圆点.
  • 调用类和函数需要加英文圆括号( )
  • 调用变量不用加英文圆括号( ),因为变量没有参数可以传递。

4.3 os.listdir-返回目录中的文件名列表

listdir()是一个Python的内置函数,用于返回指定目录中所有文件和文件夹名称的列表。

【语法】

os.listdir(path)

【参数】

path[pɑːθ]:路径。

path表示路径,指文件和文件夹的目录路径。

path可以是相对路径或绝对路径。

【返回值】

返回的数据类型是列表。

列表中的每个元素都是字符串类型。

如果指定的路径不存在或不是一个目录,则会引发OSError异常

【相对路径】

import os
os.listdir(".")

【终端输出】

['1.ipynb',
 '销售表-1月.xlsx',
 '销售表-2月.xlsx',
 '销售表-3月.xlsx',
 '销售表-4月.xlsx',
 '销售表-5月.xlsx']
  • os是库名。
  • .英文小圆点,库后接一个小圆点表示调用。
  • listdir函数名,作用是返回目录中所有文件和文件夹名称的列表。
  • 英文圆括号( )
  • ".",这里的表示当前工作目录。

【绝对路径】

import os
os.listdir("D:\安迪笔记\Excel合并")

【终端输出】

['1.ipynb',
 '年度销售表.xlsx',
 '销售表-1月.xlsx',
 '销售表-2月.xlsx',
 '销售表-3月.xlsx',
 '销售表-4月.xlsx',
 '销售表-5月.xlsx']

上述代码中的.也可以换成绝对路径"D:\安迪笔记\Excel合并"

"D:\安迪笔记\Excel合并"是我表格文件的存储路径,你需要换成你的路径。

os库的相关知识可参考下面的链接:

72. import 导入标准模块(os模块)

路径的相关知识可参考下面的链接:

67. Python的绝对路径

68. Python的相对路径

for filename in os.listdir("."):
    print(filename)

【终端输出】

1.ipynb
年度销售表.xlsx
销售表-1月.xlsx
销售表-2月.xlsx
销售表-3月.xlsx
销售表-4月.xlsx
销售表-5月.xlsx
  • os.listdir(".")得到的是一个文件名列表。
  • 用for循环遍历文件名列表中的每个文件名,赋值给变量filename
  • filename的数据类型为字符串类型。
filename = '1.ipynb'
filename = '销售表-1月.xlsx'
filename = '销售表-2月.xlsx'
filename = '销售表-3月.xlsx'
filename = '销售表-4月.xlsx'
filename = '销售表-5月.xlsx'

4.4 startswith-用于判断一个字符串是否以指定的前缀开头

startswith() 是 Python 字符串方法之一,用于判断一个字符串是否以指定的前缀开头

【语法】

string.startswith(prefix, start, end)

string表示一个具体的字符串。

startswith是方法名。

【参数】

  • prefix:必需参数,表示要检查的前缀,可以是一个字符或一个字符串。
  • start:可选参数,指定开始检查的起始位置,默认为 0。
  • end:可选参数,指定结束检查的位置,默认为字符串的长度。

【返回值】

返回一个布尔值,表示字符串是否以指定的前缀开始。

如果字符串以指定的前缀开始,则返回 True;否则返回 False。

【代码示例】

string = "安迪python学习笔记"

# 判断字符串是否以安迪开头
# 是输出 True
print(string.startswith("安迪")) 

# 字符串索引从0开始编号
# 索引2对应字符串的第3个字符
# 从字符串索引为2的位置开始检查
# 判断字符串第3位(包含)之后是否为python
# 是,输出 True
print(string.startswith("python", 2))  

# 检查范围为字符串索引2到索引8
print(string.startswith("Python", 2, 8))  # 这里是大写,输出False
print(string.startswith("python", 2, 8))  # 输出 True

【终端输出】

True
True
False
True

【实操练习】

filename = '销售表-1月.xlsx'
print(filename.startswith("销售表-")) 

【终端输出】

True

filename是变量名,数据类型是字符串。

返回True表示字符串以销售表-开头。

filename = '1.ipynb'
print(filename.startswith("销售表-"))

【终端输出】

False

返回False表示字符串不是以销售表-开头。

for filename in os.listdir("."):
    print(filename.startswith("销售表-"))

【终端输出】

False
True
True
True
True
True

4.5 endswith-用于判断一个字符串是否以指定的后缀结束

【语法】

string.endswith(suffix, start, end)

【参数】

  • suffix:必需参数,表示要检查的后缀,可以是字符串或元组类型。如果是元组,则会依次检查后缀是否包含在元组中的任意一个。
  • start:可选参数,指定开始检查的索引位置,默认为 0,表示从字符串的开头开始。
  • end:可选参数,指定结束检查的索引位置,默认为字符串的长度,表示一直检查到字符串的末尾。

【返回值】

返回一个布尔值,表示字符串是否以指定的后缀结束。

如果字符串以指定的后缀结束,则返回 True;否则返回 False。

【实操练习】

filename = '销售表-1月.xlsx'
print(filename.endswith(".xlsx"))

【终端输出】

True

返回True表示字符串以.xlsx结束。

filename = '1.ipynb'
print(filename.endswith(".xlsx"))

【终端输出】

False

返回False表示字符串不是以.xlsx结束。

for filename in os.listdir("."):
    print(filename.endswith(".xlsx"))

【终端输出】

False
True
True
True
True
True
if filename.startswith("销售表-") and filename.endswith(".xlsx"):

filenamee.startswith("销售表-")检查文件名是否以销售表-开头。
filename.endswith(".xlsx") 检查文件名是否以.xlsx结尾。
如果文件名符合上述两个条件,则执行以下代码块。

判断文件名是否以"销售表-“开头并且以”.xlsx"结尾

data_list.append(pd.read_excel(filename))

4.6 列表名.append向列表中增加元素

append函数用于在列表的末尾添加一个元素。

【语法】

列表名.append(要添加的元素)

【代码示例1】

data_list  = []
data_list.append("张三")
print(data_list)

【终端输出】

['张三']

【代码示例2】

data_list  = []
for i in range(3):
    data_list.append(i)
print(data_list)

【终端输出】

[0, 1, 2]

4.7 pd.read_excel读取Excel文件

read_excel是pandas 库中一个方法。

作用是读取 Excel 文件中的数据。

【语法】

pandas.read_excel(io)

read_excel方法提供了许多参数,这里仅介绍一个路径参数。

【参数】

io:要读取的Excel文件的路径(字符串类型)。

【返回值】

返回一个DataFrame对象。

【代码示例】

pd.read_excel('销售表-1月.xlsx')

【终端输出】

日期员工编号员工姓名销售额
0449273001刘一1000
1449283002陈二2000
2449293003张三3000
3449303004李四4000
4449313005王五5000
  • pd库名。
  • .英文小圆点,作用是调用库的方法。
  • read_excel方法名,作用是读取Excel文件。
  • 参数'销售表-1月.xlsx',表示要读取的Excel文件的路径。
print(type(pd.read_excel('销售表-1月.xlsx')))

【终端输出】

<class 'pandas.core.frame.DataFrame'>

返回的是DataFrame对象。

【思路解析】

通过4.5代码我们知道我当前的文件夹里有6个文件,如下所示:

filename = '1.ipynb'
filename = '销售表-1月.xlsx'
filename = '销售表-2月.xlsx'
filename = '销售表-3月.xlsx'
filename = '销售表-4月.xlsx'
filename = '销售表-5月.xlsx'

我的目标任务是要汇总5个Excel表格,因此我用了一个if条件判断语句选取了要汇总的文件路径,排除了不需要汇总的文件路径。

if filename.startswith("销售表-") and filename.endswith(".xlsx"):

filename = '1.ipynb'时,if条件判断语句的结果为False,它不会执行后面的读取Excel代码。

filename = '销售表-1月.xlsx'时,if条件判断语句的结果为True,执行后面的读取Excel代码。

【实操练习】

for filename in os.listdir("."):
    if filename.startswith("销售表-") and filename.endswith(".xlsx"):
        data = pd.read_excel(filename)
        print(data)

【终端输出】

      日期  员工编号 员工姓名   销售额
0  44927  3001   刘一  1000
1  44928  3002   陈二  2000
2  44929  3003   张三  3000
3  44930  3004   李四  4000
4  44931  3005   王五  5000
      日期  员工编号 员工姓名   销售额
0  44958  3001   刘一  1000
1  44959  3002   陈二  2000
2  44960  3003   张三  3000
3  44961  3004   李四  4000
4  44962  3005   王五  5000
      日期  员工编号 员工姓名   销售额
0  44986  3001   刘一  1000
1  44987  3002   陈二  2000
2  44988  3003   张三  3000
3  44989  3004   李四  4000
4  44990  3005   王五  5000
      日期  员工编号 员工姓名   销售额
0  45017  3001   刘一  1000
1  45018  3002   陈二  2000
2  45019  3003   张三  3000
3  45020  3004   李四  4000
4  45021  3005   王五  5000
      日期  员工编号 员工姓名   销售额
0  45047  3001   刘一  1000
1  45048  3002   陈二  2000
2  45049  3003   张三  3000
3  45050  3004   李四  4000
4  45051  3005   王五  5000

通过pd.read_excel(filename)读取到的数据如上所示。

data = pd.read_excel(filename)
  • data变量名,数据类型为DataFrame
  • pd库名。
  • .英文小圆点,作用是调用库的方法。
  • read_excel方法名,作用是读取Excel文件。
  • 参数filename,表示要读取的Excel文件的路径。

4.8 将读取到的Excel数据添加到列表里

data_list = []
for filename in os.listdir("."):
    if filename.startswith("销售表-") and filename.endswith(".xlsx"):
        data_list.append(pd.read_excel(filename))
print(data_list)

【终端输出】

[      日期  员工编号 员工姓名   销售额
0  44927  3001   刘一  1000
1  44928  3002   陈二  2000
2  44929  3003   张三  3000
3  44930  3004   李四  4000
4  44931  3005   王五  5000,       日期  员工编号 员工姓名   销售额
0  44958  3001   刘一  1000
1  44959  3002   陈二  2000
2  44960  3003   张三  3000
3  44961  3004   李四  4000
4  44962  3005   王五  5000,       日期  员工编号 员工姓名   销售额
0  44986  3001   刘一  1000
1  44987  3002   陈二  2000
2  44988  3003   张三  3000
3  44989  3004   李四  4000
4  44990  3005   王五  5000,       日期  员工编号 员工姓名   销售额
0  45017  3001   刘一  1000
1  45018  3002   陈二  2000
2  45019  3003   张三  3000
3  45020  3004   李四  4000
4  45021  3005   王五  5000,       日期  员工编号 员工姓名   销售额
0  45047  3001   刘一  1000
1  45048  3002   陈二  2000
2  45049  3003   张三  3000
3  45050  3004   李四  4000
4  45051  3005   王五  5000]

观察输出结果,注意输出的列表中包含5个列名:日期 员工编号 员工姓名 销售额

data_list.append(pd.read_excel(filename))
  • data_list列表名。

  • .英文小圆点。

  • append函数名,作用是向列表增加元素。

  • pd是库名。

  • read_excel读取 Excel 文件中的数据。

  • filename文件路径。

  • pd.read_excel(filename)得到的是一个DataFrame对象。

4.9 pd.concat合并Pandas数据

concat ()方法用于连接两个或多个数组。

【语法】

pandas.concat(objs, axis=0, join='outer', ignore_index=False)

【参数】

objs:要合并的 Pandas 数据结构,可以是 Series、DataFrame 或者 Panel 对象的列表或字典。
axis:指定合并的轴向,默认为 0,表示按行进行合并;如果设置为 1,表示按列进行合并。
join:指定合并的方式,默认为 ‘outer’,表示按照索引的并集进行合并;如果设置为 ‘inner’,表示按照索引的交集进行合并。
ignore_index:是否忽略原始对象的索引,默认为 False。如果设置为 True,则会创建一个新的整数索引。

【代码示例】

import pandas as pd

# 创建两个 DataFrame 对象
df1 = pd.DataFrame({'姓名': ['张三', '李四', '王五'], '性别': ['男', '男', '女']})
df2 = pd.DataFrame({'姓名': ['赵六', '孙七', '周八'], '性别': ['男', '男', '女']})

# 按行合并两个 DataFrame
result = pd.concat([df1, df2], axis=0, ignore_index=True)
print(result)

【终端输出】

   姓名 性别
0  张三  男
1  李四  男
2  王五  女
3  赵六  男
4  孙七  男
5  周八  女

上述代码要合并的是DataFrame对象。

【实操练习】

data_all =pd.concat(data_list)
print(data_all)
print(type(data_all))

【终端输出】

      日期  员工编号 员工姓名   销售额
0  44927  3001   刘一  1000
1  44928  3002   陈二  2000
2  44929  3003   张三  3000
3  44930  3004   李四  4000
4  44931  3005   王五  5000
0  44958  3001   刘一  1000
1  44959  3002   陈二  2000
2  44960  3003   张三  3000
3  44961  3004   李四  4000
4  44962  3005   王五  5000
0  44986  3001   刘一  1000
1  44987  3002   陈二  2000
2  44988  3003   张三  3000
3  44989  3004   李四  4000
4  44990  3005   王五  5000
0  45017  3001   刘一  1000
1  45018  3002   陈二  2000
2  45019  3003   张三  3000
3  45020  3004   李四  4000
4  45021  3005   王五  5000
0  45047  3001   刘一  1000
1  45048  3002   陈二  2000
2  45049  3003   张三  3000
3  45050  3004   李四  4000
4  45051  3005   王五  5000
<class 'pandas.core.frame.DataFrame'>

观察输出结果,注意输出的列表中仅包含1个列名:日期 员工编号 员工姓名 销售额

data_all =pd.concat(data_list)

  • data_all变量名,DataFrame对象,存储合并后的数据。
  • pd库名。
  • .英文小圆点。
  • concat方法名,作用是合并Pandas数据。
  • data_list要合并的数据。

4.10 DataFrame.to_excel-将 DataFrame 保存为 excel 文件

【语法】

DataFrame.to_excel(path, index=False)

DataFrame.to_excel将 DataFrame 保存为 excel 文件。

【参数】

path路径参数,将DataFrame保存到指定的路径下。

index可选参数。

index=True,保存索引列。

index=False,不保存索引列。

【实操练习】

data_all.to_excel("年度销售表.xlsx",index=False)
  • data_all变量名,DataFrame对象,存储了合并后的数据。
  • .英文小圆点。
  • to_excel方法名,作用是将 DataFrame 保存为 excel 文件。
  • "年度销售表.xlsx"路径参数,即汇总后Excel文件名。
  • index=False不保存索引列。

运行上面的代码后,当前文件夹下会生成一个名为年度销售表.xlsx文件。

在这里插入图片描述

4.11 DataFrame.shape-查看 DataFrame 的行数和列数。

shape 是 Pandas 库中的 DataFrame 对象的属性。

调用DataFrame.shape 会返回一个元组。

该元组包含两个整数值,分别表示 DataFrame 的行数和列数。

【代码示例】

import pandas as pd

data = {'姓名': ['张三', '李四', '王五'],
        '年龄': [25, 30, 35]
        }

df = pd.DataFrame(data)
print(df)
print(df.shape)  # 输出 (3, 3)

【终端输出】

   姓名  年龄
0  张三  25
1  李四  30
2  王五  35
(3, 2)

元组的3表示DataFrame对象有3行。
元组的2表示DataFrame对象有2列。

注意不包含列索引和行索引。

在这里插入图片描述

【实操练习】

rows = data_all.shape
print("查看行数与列数:", rows)

【终端输出】

查看行数与列数: (25, 4)

【备注】

联系作者回复【6.合并多个Excel】领取源文件和表格。

5. 总结

在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐