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

Python實(shí)現(xiàn)一鍵下載并整合統(tǒng)計(jì)年鑒Excel文件

 更新時(shí)間:2026年04月24日 08:37:19   作者:Laurentianelle  
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)一鍵下載并整合統(tǒng)計(jì)年鑒Excel文件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

背景介紹

如果你經(jīng)常做數(shù)據(jù)分析、論文寫(xiě)作或數(shù)據(jù)整理,可能會(huì)遇到這樣的問(wèn)題:

統(tǒng)計(jì)年鑒官網(wǎng)上有幾十甚至上百個(gè) Excel 文件,需要一個(gè)個(gè)點(diǎn)開(kāi)下載,還要手動(dòng)分類(lèi)整理,非常耗時(shí)。

這篇文章要講的這段 Python 代碼,可以幫你:

  • 自動(dòng)抓取網(wǎng)頁(yè)上的所有 Excel 文件
  • 批量下載到本地
  • 按文件名前兩位數(shù)字自動(dòng)分類(lèi)
  • 自動(dòng)合并為一個(gè) Excel 文件(每個(gè)子類(lèi)作為一個(gè) Sheet)
  • 自動(dòng)跳過(guò)已下載文件,避免重復(fù)下載

重要提醒:

本代碼僅供學(xué)習(xí)交流使用。請(qǐng)?jiān)诤戏ê弦?guī)前提下使用,遵守網(wǎng)站數(shù)據(jù)使用規(guī)范和相關(guān)法律法規(guī)。

代碼功能說(shuō)明

這段代碼做了三件事:

第一步:抓取 Excel 下載鏈接

從指定網(wǎng)頁(yè)中,自動(dòng)提取所有 .xls.xlsx 文件鏈接。

第二步:批量下載

自動(dòng)下載所有 Excel 文件到本地文件夾。

第三步:自動(dòng)整合

根據(jù)文件名前兩位數(shù)字進(jìn)行“大類(lèi)分類(lèi)”,生成:

01_年鑒.xlsx
02_年鑒.xlsx
03_年鑒.xlsx
...

每個(gè)文件中:

  • 不同子類(lèi)放在不同 sheet 中
  • 自動(dòng)清理非法字符
  • 自動(dòng)跳過(guò)空文件
  • 自動(dòng)避免 openpyxl 報(bào)錯(cuò)

運(yùn)行完成后,你會(huì)在本地看到:

F:\年鑒
 ├── 2023
 │   ├── excel
 │   ├── 01_年鑒.xlsx
 │   ├── 02_年鑒.xlsx
 ├── 2024

運(yùn)行環(huán)境準(zhǔn)備

安裝 Python

推薦安裝 Python 3.9 以上版本。

檢查是否已安裝:

python --version

創(chuàng)建項(xiàng)目文件夾

例如:

D:\yearbook_project

在該文件夾中新建:

main.py

把下面的代碼復(fù)制進(jìn)去。

安裝依賴(lài)庫(kù)

打開(kāi)命令行(Win + R → 輸入 cmd),執(zhí)行:

pip install requests pandas beautifulsoup4 openpyxl

這些庫(kù)的作用(用大白話解釋?zhuān)?/p>

  • requests:負(fù)責(zé)“幫你打開(kāi)網(wǎng)頁(yè)”
  • beautifulsoup4:負(fù)責(zé)“從網(wǎng)頁(yè)里找下載鏈接”
  • pandas:負(fù)責(zé)“讀取和寫(xiě)入 Excel”
  • openpyxl:負(fù)責(zé)“生成 Excel 文件”

詳細(xì)運(yùn)行步驟

第一步:修改保存路徑

找到代碼中的:

base_dir = r"F:\年鑒"

修改為你電腦上的路徑,例如:

base_dir = r"D:\yearbook_project\data"

注意:必須是存在的磁盤(pán)路徑。

第二步:保存代碼

保存為:

main.py

第三步:運(yùn)行代碼

在項(xiàng)目目錄中執(zhí)行:

python main.py

第四步:觀察運(yùn)行過(guò)程

終端會(huì)看到類(lèi)似輸出:

[INFO] 2023 年抓取 Excel 鏈接...
[INFO] 2023 年發(fā)現(xiàn) 86 個(gè) Excel 文件
[OK] 下載成功: ...
[OK] 01_年鑒.xlsx 已生成

第五步:驗(yàn)證結(jié)果

打開(kāi)你設(shè)置的目錄:

D:\yearbook_project\data

你會(huì)看到:

  • 每個(gè)年份一個(gè)文件夾
  • 每個(gè)大類(lèi)一個(gè)整合好的 Excel 文件

打開(kāi) Excel,可以看到多個(gè) Sheet。

核心代碼解析(新手能看懂版)

下面是完整代碼(已去除任何私人信息,可直接運(yùn)行):

import os
import re
import requests
import pandas as pd
from bs4 import BeautifulSoup
from collections import defaultdict

# ================= 配置 =================
base_dir = r"D:\【your_folder】"
years = [2023, 2024]
base_urls = {
    2023: "https://oss.henan.gov.cn/sbgt-wztipt/attachment/hntjj/hntj/lib/tjnj/2023nj/zk/lefte.htm",
    2024: "https://oss.henan.gov.cn/sbgt-wztipt/attachment/hntjj/hntj/lib/tjnj/2024nj/zk/indexce.htm"
}

# ================= 工具函數(shù) =================
def get_excel_links(url, year):
    """解析頁(yè)面,返回所有 Excel 文件的完整 URL 列表"""
    try:
        resp = requests.get(url, timeout=20)
        resp.raise_for_status()
        resp.encoding = 'gb2312'
    except Exception as e:
        print(f"[ERROR] 獲取網(wǎng)頁(yè)失敗: {url} ({e})")
        return []

    soup = BeautifulSoup(resp.text, "html.parser")
    links = []
    for a in soup.find_all('a', href=True):
        href = a['href']
        if href.lower().endswith(('.xls', '.xlsx')):
            if href.startswith("http"):
                links.append(href)
            else:
                base = f"https://oss.henan.gov.cn/sbgt-wztipt/attachment/hntjj/hntj/lib/tjnj/{year}nj/zk/"
                links.append(base + href.lstrip('./'))
    return links

def download_file(url, save_path):
    """下載文件,如果已存在則跳過(guò)"""
    if os.path.exists(save_path) and os.path.getsize(save_path) > 0:
        print(f"[SKIP] 已存在: {save_path}")
        return
    try:
        resp = requests.get(url, timeout=30)
        resp.raise_for_status()
        with open(save_path, 'wb') as f:
            f.write(resp.content)
        print(f"[OK] 下載成功: {save_path}")
    except Exception as e:
        print(f"[ERROR] 下載失敗: {save_path} ({e})")

def clean_and_merge_by_category(year_folder, output_dir):
    excel_files = [f for f in os.listdir(year_folder) if f.lower().endswith(('.xls', '.xlsx'))]
    if not excel_files:
        print(f"[INFO] 沒(méi)有 Excel 文件可整合: {year_folder}")
        return

    category_dict = defaultdict(list)

    # 這里是“按文件名前兩位分組”
    for f in excel_files:
        match = re.match(r'(\d{2})(\d{2})', f)
        if not match:
            print(f"[WARN] 文件名不符合規(guī)則,跳過(guò): {f}")
            continue
        main_cat, sub_cat = match.groups()
        category_dict[main_cat].append((f, sub_cat))

    os.makedirs(output_dir, exist_ok=True)

    for main_cat, files in category_dict.items():
        sheets_to_write = []

        for fname, sub_cat in files:
            path = os.path.join(year_folder, fname)
            try:
                with pd.ExcelFile(path) as xl:
                    for sheet_name in xl.sheet_names:
                        df = xl.parse(sheet_name, header=None)
                        if df.empty:
                            continue
                        sheet_name_clean = re.sub(r'[\\/*?:[\]]', '', sub_cat)[:31]
                        sheets_to_write.append((df, sheet_name_clean))
            except Exception as e:
                print(f"[ERROR] 處理 {path} 失敗 ({e})")

        if not sheets_to_write:
            sheets_to_write.append((pd.DataFrame({"提示": ["此大類(lèi)下無(wú)有效數(shù)據(jù)"]}), "占位"))

        output_file = os.path.join(output_dir, f"{main_cat}_年鑒.xlsx")

        if os.path.exists(output_file):
            os.remove(output_file)

        with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
            for df, sheet_name_clean in sheets_to_write:
                df.to_excel(writer, sheet_name=sheet_name_clean, index=False, header=False)

        print(f"[OK] {main_cat}_年鑒.xlsx 已生成")

# ================= 主流程 =================
for year in years:
    print(f"\n[INFO] {year} 年抓取 Excel 鏈接...")
    url = base_urls[year]
    links = get_excel_links(url, year)
    print(f"[INFO] {year} 年發(fā)現(xiàn) {len(links)} 個(gè) Excel 文件")

    year_folder = os.path.join(base_dir, str(year), "excel")
    os.makedirs(year_folder, exist_ok=True)

    for link in links:
        fname = os.path.basename(link)
        save_path = os.path.join(year_folder, fname)
        download_file(link, save_path)

    output_dir = os.path.join(base_dir, str(year))
    clean_and_merge_by_category(year_folder, output_dir)

print("\n[INFO] 所有年份下載與整合完成!")

用大白話理解核心邏輯

get_excel_links()

可以理解成:“打開(kāi)網(wǎng)頁(yè) → 找到所有下載按鈕 → 把 Excel 鏈接抄下來(lái)”

download_file()

可以理解成:“把鏈接里的文件保存到本地”

并且:

  • 如果已經(jīng)下載過(guò) → 自動(dòng)跳過(guò)
  • 避免重復(fù)浪費(fèi)時(shí)間

clean_and_merge_by_category()

這是核心。

它做了:

  1. 找出所有 Excel 文件
  2. 按文件名前兩位數(shù)字分組
  3. 每一組生成一個(gè)新的 Excel
  4. 每個(gè)子類(lèi)作為一個(gè) Sheet

就像:把一堆散亂的資料,自動(dòng)裝進(jìn)不同文件夾。

常見(jiàn)問(wèn)題解決

問(wèn)題1:ModuleNotFoundError

原因:沒(méi)安裝依賴(lài)

解決:

pip install requests pandas beautifulsoup4 openpyxl

問(wèn)題2:下載失敗

可能原因:

  • 網(wǎng)絡(luò)問(wèn)題
  • 網(wǎng)站限制
  • 被防爬

解決:

  • 換網(wǎng)絡(luò)
  • 增加 timeout
  • 合法合規(guī)使用

問(wèn)題3:路徑報(bào)錯(cuò)

例如:

FileNotFoundError

原因:路徑不存在

解決:

  • 確認(rèn)磁盤(pán)存在
  • 不要寫(xiě)錯(cuò)盤(pán)符
  • 不要有中文空格

問(wèn)題4:Excel 寫(xiě)入報(bào)錯(cuò)

原因:

  • 文件正在打開(kāi)
  • openpyxl 未安裝

解決:

  • 關(guān)閉 Excel 再運(yùn)行
  • 安裝 openpyxl

總結(jié)

這段代碼解決了三個(gè)核心問(wèn)題:

  1. 批量下載
  2. 自動(dòng)分類(lèi)
  3. 自動(dòng)整合

適合:

  • 數(shù)據(jù)分析人員
  • 寫(xiě)論文的同學(xué)
  • 做數(shù)據(jù)研究的人

如果你是新手,只要按照:環(huán)境準(zhǔn)備 → 安裝依賴(lài) → 修改路徑 → 運(yùn)行 → 查看結(jié)果

這五步,就能成功跑起來(lái)。

再次提醒:請(qǐng)合法合規(guī)使用,僅供學(xué)習(xí)交流。

到此這篇關(guān)于Python實(shí)現(xiàn)一鍵下載并整合統(tǒng)計(jì)年鑒Excel文件的文章就介紹到這了,更多相關(guān)Python下載并整合Excel文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 30秒學(xué)會(huì)30個(gè)超實(shí)用Python代碼片段【收藏版】

    30秒學(xué)會(huì)30個(gè)超實(shí)用Python代碼片段【收藏版】

    許多人在數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)、web開(kāi)發(fā)、腳本編寫(xiě)和自動(dòng)化等領(lǐng)域中都會(huì)使用Python,它是一種十分流行的語(yǔ)言。本文將簡(jiǎn)要介紹30個(gè)簡(jiǎn)短的、且能在30秒內(nèi)掌握的代碼片段,感興趣的朋友一起看看吧
    2019-10-10
  • VSCode中Python環(huán)境配置、創(chuàng)建虛擬環(huán)境及pip的一些常用命令

    VSCode中Python環(huán)境配置、創(chuàng)建虛擬環(huán)境及pip的一些常用命令

    這篇文章主要給大家介紹了關(guān)于VSCode中Python環(huán)境配置、創(chuàng)建虛擬環(huán)境及pip的一些常用命令,Python環(huán)境的創(chuàng)建是在VSCode中很常見(jiàn)的一個(gè)需求,特別是當(dāng)我們需要開(kāi)發(fā)或者調(diào)試多個(gè)Python項(xiàng)目時(shí),使用虛擬環(huán)境是一種好的方式,需要的朋友可以參考下
    2023-10-10
  • PyQt轉(zhuǎn)換路徑中的斜杠(斜杠(/)與反斜杠(\)轉(zhuǎn)換)

    PyQt轉(zhuǎn)換路徑中的斜杠(斜杠(/)與反斜杠(\)轉(zhuǎn)換)

    本文主要介紹了PyQt轉(zhuǎn)換路徑中的斜杠(斜杠(/)與反斜杠(\)轉(zhuǎn)換),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 使用jupyter notebook將文件保存為Markdown,HTML等文件格式

    使用jupyter notebook將文件保存為Markdown,HTML等文件格式

    這篇文章主要介紹了使用jupyter notebook將文件保存為Markdown,HTML等文件格式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • python編寫(xiě)五子棋游戲

    python編寫(xiě)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了python編寫(xiě)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Python使用pywifi模塊實(shí)現(xiàn)輕松查看WIFI密碼

    Python使用pywifi模塊實(shí)現(xiàn)輕松查看WIFI密碼

    這篇文章主要為大家詳細(xì)介紹了Python如何使用pywifi模塊實(shí)現(xiàn)輕松查看WIFI密碼,如果你不幸忘記了某個(gè)wifi的密碼,但是你大概知道密碼的一些構(gòu)成,也可以參考下面的腳本
    2025-05-05
  • jupyter notebook 添加kernel permission denied的操作

    jupyter notebook 添加kernel permission denied的操作

    這篇文章主要介紹了jupyter notebook 添加kernel permission denied的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • pytorch中獲取模型input/output shape實(shí)例

    pytorch中獲取模型input/output shape實(shí)例

    今天小編就為大家分享一篇pytorch中獲取模型input/output shape實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Python簡(jiǎn)單基礎(chǔ)小程序的實(shí)例代碼

    Python簡(jiǎn)單基礎(chǔ)小程序的實(shí)例代碼

    這篇文章主要介紹了Python簡(jiǎn)單基礎(chǔ)小程序的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-04-04
  • 如何用pandas讀取一個(gè)文件或某個(gè)文件夾下所有文件

    如何用pandas讀取一個(gè)文件或某個(gè)文件夾下所有文件

    這篇文章主要介紹了如何用pandas讀取一個(gè)文件或某個(gè)文件夾下所有文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02

最新評(píng)論

西乌珠穆沁旗| 尉氏县| 沁阳市| 乐业县| 衡南县| 南溪县| 南皮县| 麟游县| 阿拉尔市| 墨玉县| 甘泉县| 金溪县| 获嘉县| 鄂尔多斯市| 垣曲县| 华蓥市| 星子县| 西华县| 潜江市| 黄石市| 延边| 寿阳县| 鄂托克旗| 来凤县| 藁城市| 奉贤区| 西乌珠穆沁旗| 临江市| 邻水| 赤峰市| 吉木乃县| 武威市| 文昌市| 扎兰屯市| 贵定县| 东平县| 宁城县| 固始县| 综艺| 县级市| 牡丹江市|