最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)一鍵合并多文件夾下百份Excel自動(dòng)匯總至總表

 更新時(shí)間:2026年06月23日 08:23:47   作者:小莊-Python辦公  
本文介紹了一個(gè)使用Python自動(dòng)合并多文件夾下Excel文件的解決方案,通過30行代碼即可實(shí)現(xiàn)遞歸遍歷目錄、讀取Excel數(shù)據(jù)并合并為總表的功能,大幅提升辦公效率,希望對(duì)大家有所幫助

場景引入

每月底,財(cái)務(wù)部門的同事小張總會(huì)遇到這樣的噩夢:公司下屬 12 個(gè)分公司各自把報(bào)表放在不同的文件夾里,每個(gè)文件夾又有 5-10 份 Excel 文件,格式基本一致但文件名五花八門。小張需要手動(dòng)打開每一份文件,復(fù)制粘貼到匯總表里——每次都要花掉整整半天時(shí)間。

學(xué)完本節(jié),你可以用 不到 30 行 Python 代碼,一鍵遍歷所有文件夾、讀取所有 Excel 文件,自動(dòng)合并成一張總表,全程只需 3 秒鐘。

技術(shù)原理

核心思路分三步:

  1. 遍歷目錄樹:使用 Python 內(nèi)置的 os.walk()pathlib 遞歸掃描所有子文件夾
  2. 讀取 Excel 文件:使用 pandas.read_excel() 將每個(gè) Excel 文件讀取為 DataFrame
  3. 縱向拼接:使用 pandas.concat() 將多個(gè) DataFrame 按行合并,最后導(dǎo)出為新的 Excel 文件

文件夾結(jié)構(gòu)示意:
數(shù)據(jù)源/
├── 北京分公司/
│   ├── 1月報(bào)表.xlsx
│   └── 2月報(bào)表.xlsx
├── 上海分公司/
│   ├── Q1匯總.xlsx
│   └── Q2匯總.xlsx
└── 廣州分公司/
    └── 年度報(bào)表.xlsx
         ↓ Python 自動(dòng)遍歷 + 合并
    ↓
總表.xlsx(包含所有數(shù)據(jù))

環(huán)境準(zhǔn)備

安裝依賴庫

pip install pandas openpyxl
庫名作用
pandas數(shù)據(jù)處理核心,提供 DataFrame 結(jié)構(gòu)和 concat 合并功能
openpyxlpandas 讀取 .xlsx 文件的引擎(必須安裝)

完整代碼

import os
import pandas as pd
from pathlib import Path

def merge_excel_files(source_dir, output_file="總表匯總.xlsx"):
    """
    遍歷指定目錄下所有子文件夾中的 Excel 文件,合并為一張總表

    參數(shù):
        source_dir: 包含 Excel 文件的根目錄路徑
        output_file: 輸出匯總文件的文件名
    """
    all_dataframes = []  # 存儲(chǔ)所有讀取到的 DataFrame
    file_count = 0       # 統(tǒng)計(jì)處理的文件數(shù)

    # 將路徑轉(zhuǎn)為 Path 對(duì)象,方便操作
    root_path = Path(source_dir)

    if not root_path.exists():
        print(f"錯(cuò)誤:目錄 {source_dir} 不存在!")
        return

    # os.walk 遞歸遍歷所有子文件夾
    for dirpath, dirnames, filenames in os.walk(source_dir):
        for filename in filenames:
            # 只處理 .xlsx 和 .xls 文件
            if filename.endswith(('.xlsx', '.xls')) and not filename.startswith('~$'):
                file_path = os.path.join(dirpath, filename)
                file_count += 1

                try:
                    # 讀取 Excel 文件(默認(rèn)讀取第一個(gè) sheet)
                    df = pd.read_excel(file_path, engine='openpyxl' if filename.endswith('.xlsx') else 'xlrd')

                    # 可選:添加一列來源信息,記錄數(shù)據(jù)來自哪個(gè)文件
                    df['數(shù)據(jù)來源文件'] = filename
                    df['數(shù)據(jù)來源路徑'] = dirpath

                    all_dataframes.append(df)
                    print(f"[{file_count}] 已讀取: {filename}")

                except Exception as e:
                    print(f"[{file_count}] 讀取失敗 {filename}: {e}")

    if not all_dataframes:
        print("沒有找到任何 Excel 文件!")
        return

    # 將所有 DataFrame 縱向拼接(按行合并)
    print("\n正在合并所有數(shù)據(jù)...")
    merged_df = pd.concat(all_dataframes, ignore_index=True)

    # 導(dǎo)出為新的 Excel 文件
    merged_df.to_excel(output_file, index=False, engine='openpyxl')

    print(f"\n合并完成!")
    print(f"共處理 {file_count} 個(gè)文件")
    print(f"總數(shù)據(jù)行數(shù): {len(merged_df)}")
    print(f"總數(shù)據(jù)列數(shù): {len(merged_df.columns)}")
    print(f"匯總文件已保存: {output_file}")


# ==================== 使用示例 ====================
if __name__ == "__main__":
    # 修改這里為你的數(shù)據(jù)文件夾路徑
    SOURCE_DIR = r"D:\數(shù)據(jù)源"

    # 執(zhí)行合并
    merge_excel_files(SOURCE_DIR, output_file="總表匯總.xlsx")

代碼逐行解析

1. 導(dǎo)入模塊

import os
import pandas as pd
from pathlib import Path
  • os:操作系統(tǒng)接口,用于遍歷文件夾
  • pandas as pd:數(shù)據(jù)處理庫,核心工具
  • Path:面向?qū)ο蟮穆窂讲僮鳎茸址唇痈踩?/li>

2. 遞歸遍歷文件夾

for dirpath, dirnames, filenames in os.walk(source_dir):

os.walk() 是 Python 內(nèi)置的目錄遍歷函數(shù),它會(huì)遞歸地進(jìn)入每個(gè)子文件夾。每次迭代返回三個(gè)值:

變量含義示例
dirpath當(dāng)前文件夾的完整路徑"D:\\數(shù)據(jù)源\\北京分公司"
dirnames當(dāng)前文件夾下的子文件夾列表["1月", "2月"]
filenames當(dāng)前文件夾下的文件列表["1月報(bào)表.xlsx", "2月報(bào)表.xlsx"]

3. 文件過濾

if filename.endswith(('.xlsx', '.xls')) and not filename.startswith('~$'):
  • endswith(('.xlsx', '.xls')):只處理 Excel 文件
  • not filename.startswith('~$'):排除 Excel 的臨時(shí)鎖文件(編輯時(shí)自動(dòng)生成)

4. 讀取 Excel 并標(biāo)記來源

df = pd.read_excel(file_path, engine='openpyxl')
df['數(shù)據(jù)來源文件'] = filename
df['數(shù)據(jù)來源路徑'] = dirpath
  • pd.read_excel() 將 Excel 文件讀取為 DataFrame(類似表格的數(shù)據(jù)結(jié)構(gòu))
  • 添加兩列來源信息,方便后續(xù)追溯數(shù)據(jù)出處

5. 合并所有數(shù)據(jù)

merged_df = pd.concat(all_dataframes, ignore_index=True)

pd.concat() 是關(guān)鍵函數(shù):

  • 將列表中的所有 DataFrame 縱向拼接(上下連接)
  • ignore_index=True 重置行索引,避免索引重復(fù)

6. 導(dǎo)出結(jié)果

merged_df.to_excel(output_file, index=False, engine='openpyxl')
  • index=False 不導(dǎo)出 pandas 自動(dòng)生成的行號(hào)
  • 最終得到一個(gè)包含所有數(shù)據(jù)的匯總 Excel 文件

進(jìn)階技巧

技巧 1:指定讀取的 Sheet 名稱

如果 Excel 文件有多個(gè) Sheet,可以指定讀取特定 Sheet:

df = pd.read_excel(file_path, sheet_name="Sheet1", engine='openpyxl')

或讀取所有 Sheet 并合并:

all_sheets = pd.read_excel(file_path, sheet_name=None, engine='openpyxl')
for sheet_name, sheet_df in all_sheets.items():
    sheet_df['來源Sheet'] = sheet_name
    all_dataframes.append(sheet_df)

技巧 2:統(tǒng)一列名后再合并

如果不同文件的列名不完全一致,可以先做列名映射:

# 定義統(tǒng)一列名映射
COLUMN_MAP = {
    '姓名': '姓名',
    '員工姓名': '姓名',
    'Name': '姓名',
    '部門': '部門',
    '所屬部門': '部門',
    '金額': '金額',
    '金額(元)': '金額',
}

# 讀取后統(tǒng)一列名
df = pd.read_excel(file_path)
df.rename(columns=COLUMN_MAP, inplace=True)

技巧 3:添加進(jìn)度條(大文件友好)

from tqdm import tqdm

for dirpath, dirnames, filenames in tqdm(os.walk(source_dir), desc="掃描文件夾"):
    for filename in filenames:
        # ... 處理邏輯

常見問題

Q1:報(bào)錯(cuò)ModuleNotFoundError: No module named 'openpyxl'

原因:沒有安裝 openpyxl 庫,pandas 讀取 .xlsx 需要此依賴。

解決:運(yùn)行 pip install openpyxl

Q2:合并后列的順序亂了怎么辦?

pd.concat() 會(huì)自動(dòng)對(duì)齊列名,但列順序可能不一致??梢允謩?dòng)指定列順序:

desired_columns = ['姓名', '部門', '金額', '日期', '數(shù)據(jù)來源文件', '數(shù)據(jù)來源路徑']
merged_df = merged_df[desired_columns]

Q3:某些 Excel 文件讀取出來是空的?

可能原因:

  • 文件本身沒有數(shù)據(jù)(只有表頭)
  • 文件被加密
  • 文件格式不是真正的 Excel(如 .csv 改了后綴)

建議在讀取后加判斷:

if df.empty:
    print(f"警告: {filename} 為空,跳過")
    continue

Q4:如何合并 .csv 文件?

只需將讀取方式改為 pd.read_csv()

if filename.endswith('.csv'):
    df = pd.read_csv(file_path, encoding='utf-8-sig')

總結(jié)

步驟核心函數(shù)作用
遍歷文件夾os.walk()遞歸掃描所有子目錄
讀取文件pd.read_excel()將 Excel 轉(zhuǎn)為 DataFrame
合并數(shù)據(jù)pd.concat()縱向拼接多個(gè) DataFrame
導(dǎo)出結(jié)果to_excel()保存為新的 Excel 文件

本節(jié)掌握了 Python 辦公自動(dòng)化中最常用的技能之一——多文件自動(dòng)合并。無論是財(cái)務(wù)報(bào)表、銷售數(shù)據(jù)還是調(diào)查問卷,只要格式一致,都可以用這套代碼一鍵匯總。

以上就是Python實(shí)現(xiàn)一鍵合并多文件夾下百份Excel自動(dòng)匯總至總表的詳細(xì)內(nèi)容,更多關(guān)于Python合并多文件夾下Excel的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python將人民幣轉(zhuǎn)換大寫的腳本代碼

    python將人民幣轉(zhuǎn)換大寫的腳本代碼

    python將人民幣轉(zhuǎn)換大寫的代碼,有需要的朋友可以參考下
    2013-02-02
  • Python CSV模塊使用實(shí)例

    Python CSV模塊使用實(shí)例

    這篇文章主要介紹了Python CSV模塊使用實(shí)例,本文將舉幾個(gè)例子來介紹一下Python的CSV模塊的使用方法,包括reader、writer、DictReader、DictWriter.register_dialect等,需要的朋友可以參考下
    2015-04-04
  • 基于Python數(shù)據(jù)分析之pandas統(tǒng)計(jì)分析

    基于Python數(shù)據(jù)分析之pandas統(tǒng)計(jì)分析

    這篇文章主要介紹了基于Python數(shù)據(jù)分析之pandas統(tǒng)計(jì)分析,具有很好對(duì)參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Pandas庫中iloc[]函數(shù)的使用方法

    Pandas庫中iloc[]函數(shù)的使用方法

    在數(shù)據(jù)分析過程中,很多時(shí)候需要從數(shù)據(jù)表中提取出相應(yīng)的數(shù)據(jù),而這么做的前提是需要先“索引”出這一部分?jǐn)?shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Pandas庫中iloc[]函數(shù)的使用方法,需要的朋友可以參考下
    2023-01-01
  • Python中try用法、內(nèi)置異常類型與自定義異常類型拓展案例詳解

    Python中try用法、內(nèi)置異常類型與自定義異常類型拓展案例詳解

    在?Python?里,try?語句主要用于異常處理,其作用是捕獲并處理代碼運(yùn)行期間可能出現(xiàn)的異常,避免程序因異常而意外終止,這篇文章主要介紹了Python中try用法、內(nèi)置異常類型與自定義異常類型拓展,需要的朋友可以參考下
    2025-04-04
  • Python打印酷炫日志的方法詳解

    Python打印酷炫日志的方法詳解

    在Python中,日志是一種非常重要的工具,可以幫助我們更好地了解程序的運(yùn)行情況,本文將介紹如何使用logging模塊來打印炫酷的日志,需要的可以參考一下
    2023-06-06
  • 情人節(jié)快樂! python繪制漂亮玫瑰

    情人節(jié)快樂! python繪制漂亮玫瑰

    情人節(jié)快樂! 這篇文章主要教大家如何用python繪制漂亮玫瑰花,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Python+OpenCV六種實(shí)時(shí)圖像處理詳細(xì)講解

    Python+OpenCV六種實(shí)時(shí)圖像處理詳細(xì)講解

    OpenCV常用的圖像處理為閾值二值化、邊緣檢測、輪廓檢測、高斯濾波、色彩轉(zhuǎn)換、調(diào)節(jié)對(duì)比度。本文主要介紹了利用Python和OpenCV對(duì)實(shí)時(shí)圖像進(jìn)行上述六種操作的詳細(xì)講解,感興趣的可以了解一下。
    2021-11-11
  • python如何實(shí)現(xiàn)反向迭代

    python如何實(shí)現(xiàn)反向迭代

    這篇文章主要為大家詳細(xì)介紹了python如何實(shí)現(xiàn)反向迭代,進(jìn)行反向迭代,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • numpy.linspace函數(shù)具體使用詳解

    numpy.linspace函數(shù)具體使用詳解

    這篇文章主要介紹了numpy.linspace具體使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05

最新評(píng)論

德格县| 罗源县| 宁乡县| 五大连池市| 济宁市| 孝昌县| 庆城县| 乌兰浩特市| 浦江县| 黔南| 新巴尔虎左旗| 丰县| 延津县| 定远县| 隆回县| 武平县| 贡山| 仁布县| 寿宁县| 伊宁县| 呼图壁县| 海伦市| 区。| 巨鹿县| 台北县| 青龙| 雷州市| 和林格尔县| 昆山市| 象州县| 苍山县| 承德市| 枝江市| 阜新市| 潼南县| 忻州市| 德安县| 个旧市| 中阳县| 政和县| 郓城县|