【目录】
文章目录
- 6. 使用python将多个Excel文件合并到同一个excel-附代码解析
- 1. 目标任务
- 2. 结果展示
- 3. 代码示例
- 4. 代码解析
- 4.1 导入库
- 4.2 调用库的类、函数、变量语法
- 4.3 os.listdir-返回目录中的文件名列表
- 4.4 startswith-用于判断一个字符串是否以指定的前缀开头
- 4.5 endswith-用于判断一个字符串是否以指定的后缀结束
- 4.6 列表名.append向列表中增加元素
- 4.7 pd.read_excel读取Excel文件
- 4.8 将读取到的Excel数据添加到列表里
- 4.9 pd.concat合并Pandas数据
- 4.10 DataFrame.to_excel-将 DataFrame 保存为 excel 文件
- 4.11 DataFrame.shape-查看 DataFrame 的行数和列数。
 
- 5. 总结
 
【正文】
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')
【终端输出】
| 日期 | 员工编号 | 员工姓名 | 销售额 | |
|---|---|---|---|---|
| 0 | 44927 | 3001 | 刘一 | 1000 | 
| 1 | 44928 | 3002 | 陈二 | 2000 | 
| 2 | 44929 | 3003 | 张三 | 3000 | 
| 3 | 44930 | 3004 | 李四 | 4000 | 
| 4 | 44931 | 3005 | 王五 | 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. 总结


















![[Linux]进程](https://img-blog.csdnimg.cn/42383dffcbcd44fe959424c80c447792.png)

