【目录】
某文件夹中有如下5个Excel:
销售表-1月.xlsx
的内容如下:
5个Excel仅数据不一致,框架内容相同。
目标任务是将5个Excel合并成一个Excel。
源代码文件: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)
恭喜你,合并完成!
import pandas as pd
导入pandas库,并将其别名设置为pd
。
as
是一个关键字,用于给导入库指定一个别名。
别名的作用是引用pandas库中的函数和类,不必每次都写完整的pandas
,可以用别名pd
代替。
import os
导入os
库,os库用于操作文件和目录。
data_list = []
创建一个空列表,用于存储后面读取的Excel数据。
库名.类名( )
,如 csv.DictReader()
库名.函数名( )
,如 os.mkdir()
库名.变量名
,如 os.name
【总结】
.
。( )
。( )
,因为变量没有参数可以传递。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(".")
得到的是一个文件名列表。filename
。filename
的数据类型为字符串类型。filename = '1.ipynb'
filename = '销售表-1月.xlsx'
filename = '销售表-2月.xlsx'
filename = '销售表-3月.xlsx'
filename = '销售表-4月.xlsx'
filename = '销售表-5月.xlsx'
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
【语法】
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))
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]
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')))
【终端输出】
返回的是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文件的路径。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
对象。
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
观察输出结果,注意输出的列表中仅包含1个列名:日期 员工编号 员工姓名 销售额
。
data_all =pd.concat(data_list)
data_all
变量名,DataFrame对象,存储合并后的数据。pd
库名。.
英文小圆点。concat
方法名,作用是合并Pandas数据。data_list
要合并的数据。【语法】
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
文件。
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】领取源文件和表格。