将同一文件中的多个Excel文件合并为一个Excel文件,可以使用Python中的pandas
库和os
库。其中os
用于处理文件路径,pandas
用于读取和写入Excel文件。
注意事项
- 需确保所有Excel文件的结构(列名和列顺序)相同,否则合并时可能会出现错误或数据错位。
示例代码
import os
import pandas as pd
# 定义文件夹路径 folder_path(包含所有Excel文件)
folder_path = '/Users/……' # 替换为你的文件夹路径
# 获取文件夹中所有的Excel文件名并按照名称排序
excel_files = sorted(
[f for f in os.listdir(folder_path) if f.endswith('.xlsx') or f.endswith('.xls')]
) # 使用os.listdir()获取文件夹中的所有文件,并筛选出以.xlsx或.xls结尾的文件
# 创建一个空的DataFrame来存储合并后的数据
combined_df = pd.DataFrame()
# 遍历所有Excel文件并合并
for file in excel_files:
file_path = os.path.join(folder_path, file) #将文件夹路径和文件名组合成一个完整的文件路径
df = pd.read_excel(file_path, dtype={'Scode': str}) # 读取Excel文件并确保Scode列以字符串形式读取
combined_df = pd.concat([combined_df, df], ignore_index=True) # ignore_index=True为合并时重置索引
# 将合并后的数据保存到一个新的Excel文件中
output_file = '/Users/……/combined_excel.xlsx'
combined_df.to_excel(output_file, index=False)
代码说明
os.listdir()
是os
模块的一个函数,用于列出指定文件夹中的所有文件和文件夹。返回值是一个列表,包含文件夹中的所有文件和文件夹的名称。
endswith()
是字符串方法,用于检查字符串是否以指定的后缀结尾。
sorted()
sorted()
会对列表中的元素进行排序,并返回一个新的排序后的列表。默认情况下是按照字母顺序(字典序)排序。
如果需要按其他规则排序(例如按文件创建时间或修改时间),可以使用 os.path.getmtime()
或 os.path.getctime()
结合 sorted()
的 key
参数。
按文件修改时间排序
import os
# 定义文件夹路径 folder_path(包含所有Excel文件)
folder_path = '/Users/……' # 替换为你的文件夹路径
# 获取文件夹中所有的Excel文件,并按修改时间排序
excel_files = sorted(
[f for f in os.listdir(folder_path) if f.endswith('.xlsx') or f.endswith('.xls')],
key=lambda x: os.path.getmtime(os.path.join(folder_path, x))
)
按文件创建时间排序
import os
# 定义文件夹路径 folder_path(包含所有Excel文件)
folder_path = '/Users/……' # 替换为你的文件夹路径
# 获取文件夹中所有的Excel文件,并按创建时间排序
excel_files = sorted(
[f for f in os.listdir(folder_path) if f.endswith('.xlsx') or f.endswith('.xls')],
key=lambda x: os.path.getctime(os.path.join(folder_path, x))
)
os.path.join()
是 os
模块中的一个函数,用于将多个路径组合成一个完整的路径。
pd.read_excel()
是 pandas
库中用于读取 Excel 文件的函数。
pd.read_excel(io, sheet_name=0, header=0, names=None, index_col=None, usecols=None, dtype=None, engine=None)
常用参数说明
参数名 | 说明 |
---|---|
io | Excel 文件的路径或文件对象(必需参数)。 |
sheet_name | 要读取的工作表名称或索引,默认为 0 (第一个工作表)。 |
header | 指定哪一行作为列名(表头),默认为 0 (第一行)。 |
names | 自定义列名列表,覆盖文件中的列名。 |
index_col | 指定哪一列作为行索引(index),默认为 None (不使用任何列作为索引)。 |
usecols | 指定要读取的列,可以是列名列表或列索引列表。 |
dtype | 指定列的数据类型,例如 {'列名': str} 。 |
engine | 指定读取引擎,可以是 'openpyxl' (.xlsx )或 'xlrd' (.xls )。 |
import pandas as pd
file_path = 'path/to/your/file.xlsx'
# 读取 Excel 文件
df = pd.read_excel(file_path)
# 读取指定工作表(通过名称或索引)
df = pd.read_excel(file_path, sheet_name='Sheet1') # 通过名称
df = pd.read_excel(file_path, sheet_name=1) # 通过索引(从 0 开始)
# 自定义列名
df = pd.read_excel(file_path, names=['列1', '列2', '列3'])
# 指定某一列作为索引
df = pd.read_excel(file_path, index_col=0) # 使用第一列作为索引
# 只读取指定列
df = pd.read_excel(file_path, usecols=['列1', '列2']) # 通过列名
df = pd.read_excel(file_path, usecols=[0, 1]) # 通过列索引
# 指定列的数据类型
df = pd.read_excel(file_path, dtype={'Scode': str, 'Year': int})
pd.concat()
是 pandas
中用于合并多个 DataFrame 或 Series 的函数。可以在指定的行或列上将多个对象连接起来。
pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, sort=False)
常用参数说明
参数名 | 说明 |
---|---|
objs | 要合并的 DataFrame 或 Series 对象的列表或字典(必需参数)。 |
axis | 合并的轴方向,0 表示按行合并(纵向),1 表示按列合并(横向)。 |
join | 合并方式,'outer' 表示外连接(默认),'inner' 表示内连接。 |
ignore_index | 是否忽略原始索引并生成新的连续索引,默认为 False 。 |
keys | 为合并后的数据添加层次化索引,用于区分原始数据来源。 |
sort | 是否对非连接轴进行排序,默认为 False 。 |
如果合并的 DataFrame 列名不一致,join='outer'
会保留所有列并用 NaN
填充缺失值,而 join='inner'
只会保留共有的列。