在Python中,可以使用pandas
庫結合glob
模塊來遍歷讀取多個Excel文件,并將它們豎向拼接為一個DataFrame對象。以下是完整的實現方法:
文章目錄
- 方法1:使用`glob`匹配文件 + `pd.concat()`
- 方法2:使用列表推導式(更簡潔)
- 方法3:處理多個Sheet的情況
- 高級用法:添加文件來源列
- 注意事項
- 完整示例(推薦)
方法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 globdfs = []
for file in glob.glob('*.xlsx'):# 獲取所有Sheet名稱sheets = pd.ExcelFile(file).sheet_namesfor 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')
注意事項
- 內存管理:如果文件很大或很多,建議分批處理或使用
chunksize
參數 - 列一致性:確保所有Excel文件的列結構相同,否則拼接后會出現很多NaN值
- 性能優化:對于大量文件,可以使用
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)# 保存為一個xlsxresult.to_excel('匯總.xlsx')
- 異常處理:添加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 globdef 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'] = filedfs.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文件拼接的場景。