如何使用pandas将多Excel文件指定列批量写入主文件C列起始位置
问题描述
我是Stack Overflow及Python/pandas的新手,需要实现如下报表处理需求:
- 遍历
files/Daily_Reports文件夹下所有.xlsx格式文件 - 提取每个文件中名为Sales in USD的列
- 将提取到的列依次写入主文件(master file),写入起始位置为C列,直至所有文件处理完成
当前我编写的代码仅能实现遍历文件并打印对应列的效果,代码如下:
import os import pandas as pd import numpy as np folder = "files/Daily_Reports" df_total = pd.DataFrame() files = os.listdir(folder) def main(): for file in files: if file.endswith(".xlsx"): print('loading file {0}.....'.format(file)) df = pd.read_excel(f'{folder}/{file}') print(df["Sales in USD"]) if __name__ == "__main__": main()
解决方案
原有代码只完成了文件遍历和列打印的逻辑,缺少列收集、主文件读写、列位置对齐的处理,调整后的可直接运行代码如下:
import os import pandas as pd folder = "files/Daily_Reports" # 替换为你的主文件实际存储路径 master_file_path = "master.xlsx" sales_columns = [] # 提取的列自动加文件名后缀,避免多文件同名列被覆盖 use_file_as_col_suffix = True def main(): for file in os.listdir(folder): # 过滤xlsx文件,跳过Excel打开时生成的~$开头临时文件 if file.endswith(".xlsx") and not file.startswith("~$"): print(f'loading file {file}.....') file_path = os.path.join(folder, file) df = pd.read_excel(file_path) # 提取目标列并重置索引,避免拼接时行错位 sales_col = df["Sales in USD"].reset_index(drop=True) if use_file_as_col_suffix: sales_col.name = f"Sales in USD_{os.path.splitext(file)[0]}" sales_columns.append(sales_col) # 读取主文件原有内容,不存在则新建空表 if os.path.exists(master_file_path): df_master = pd.read_excel(master_file_path) else: df_master = pd.DataFrame() # 不足2列则补空列,保证写入起始位置为C列(对应第3列,索引从0开始为2) while len(df_master.columns) < 2: df_master[f"temp_empty_col_{len(df_master.columns)}"] = pd.NA # 所有提取到的销售列依次拼接到主表中 for col in sales_columns: df_master = pd.concat([df_master, col], axis=1) # 写回主文件,不写入pandas自动生成的行索引 df_master.to_excel(master_file_path, index=False) print(f"处理完成,共写入{len(sales_columns)}列销售数据到主文件") if __name__ == "__main__": main()
注意事项
- 路径拼接使用
os.path.join替代手动字符串拼接,兼容Windows、macOS、Linux不同系统的路径分隔符规则 - 自动过滤Excel打开时生成的临时文件,避免读取文件时报权限错误或格式错误
- 默认给提取的列加上来源文件名作为后缀,如果不需要可以把
use_file_as_col_suffix改为False - 如果你的主文件A、B列本身已有内容,代码会自动保留原有内容,新的销售数据从C列开始依次往后排列
- 提取列时做了索引重置,避免不同文件行数、行索引不一致导致拼接后数据错位
内容的提问来源于stack exchange,提问作者Joao Pedro Flausino
相关产品推荐
相关产品推荐

