基于Python读取多个excel竖向拼接为一个excel

发布于:2025-09-06 ⋅ 阅读:(14) ⋅ 点赞:(0)

在Python中,可以使用pandas库结合glob模块来遍历读取多个Excel文件,并将它们竖向拼接为一个DataFrame对象。以下是完整的实现方法:

方法1:使用glob匹配文件 + pd.concat()

import pandas as pd
import glob

# 1. 获取所有Excel文件路径(支持.xlsx和.xls)
excel_files = glob.glob('*.xlsx') + glob.glob('*.xls')  # 当前目录下所有Excel文件
# 或者指定路径:glob.glob('/path/to/files/*.xlsx')

# 2. 读取并拼接所有Excel文件
dfs = []
for file in excel_files:
    df = pd.read_excel(file)  # 可以添加参数如sheet_name='Sheet1'
    dfs.append(df)

# 3. 竖向拼接所有DataFrame
result = pd.concat(dfs, ignore_index=True)

# 4. 查看结果
print(result)

# 保存为一个xlsx
result.to_excel('汇总.xlsx')

方法2:使用列表推导式(更简洁)

import pandas as pd
import glob

# 读取并拼接所有Excel文件
result = pd.concat([
    pd.read_excel(f) for f in glob.glob('*.xlsx') + glob.glob('*.xls')
], ignore_index=True)

print(result)
# 保存为一个xlsx
result.to_excel('汇总.xlsx')

方法3:处理多个Sheet的情况

如果需要读取每个Excel文件的多个Sheet:

import pandas as pd
import glob

dfs = []
for file in glob.glob('*.xlsx'):
    # 获取所有Sheet名称
    sheets = pd.ExcelFile(file).sheet_names
    for sheet in sheets:
        df = pd.read_excel(file, sheet_name=sheet)
        dfs.append(df)

result = pd.concat(dfs, ignore_index=True)
# 保存为一个xlsx
result.to_excel('汇总.xlsx')

高级用法:添加文件来源列

如果需要知道每行数据来自哪个文件:

dfs = []
for file in glob.glob('*.xlsx'):
    df = pd.read_excel(file)
    df['source_file'] = file  # 添加来源文件列
    dfs.append(df)

result = pd.concat(dfs, ignore_index=True)
# 保存为一个xlsx
result.to_excel('汇总.xlsx')

注意事项

  1. 内存管理:如果文件很大或很多,建议分批处理或使用chunksize参数
  2. 列一致性:确保所有Excel文件的列结构相同,否则拼接后会出现很多NaN值
  3. 性能优化:对于大量文件,可以使用tqdm显示进度条:
    from tqdm import tqdm
    dfs = []
    for file in tqdm(glob.glob('*.xlsx')):
        dfs.append(pd.read_excel(file))
    result = pd.concat(dfs, ignore_index=True)
     # 保存为一个xlsx
     result.to_excel('汇总.xlsx')
    
  4. 异常处理:添加try-except块处理损坏的文件
    dfs = []
    for file in glob.glob('*.xlsx'):
        try:
            dfs.append(pd.read_excel(file))
        except Exception as e:
            print(f"Error reading {file}: {str(e)}")
    

完整示例(推荐)

import pandas as pd
import glob

def read_and_concat_excels(pattern='*.xlsx', sheet_name=0, add_source=False):
    """
    读取并拼接多个Excel文件
    
    参数:
        pattern: 文件匹配模式 (如 'data/*.xlsx')
        sheet_name: 要读取的Sheet名称或索引
        add_source: 是否添加来源文件列
        
    返回:
        拼接后的DataFrame
    """
    dfs = []
    for file in glob.glob(pattern):
        try:
            df = pd.read_excel(file, sheet_name=sheet_name)
            if add_source:
                df['source_file'] = file
            dfs.append(df)
        except Exception as e:
            print(f"跳过文件 {file}: {str(e)}")
    
    if not dfs:
        raise ValueError("没有找到可读取的Excel文件")
    
    return pd.concat(dfs, ignore_index=True)

# 使用示例
combined_df = read_and_concat_excels(pattern='input_files/*.xlsx', add_source=True)
combined_df.to_excel('汇总.xlsx', index=False)

这种方法既健壮又灵活,可以处理大多数Excel文件拼接的场景。


网站公告

今日签到

点亮在社区的每一天
去签到