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

Python實(shí)現(xiàn)PDF表格轉(zhuǎn)CSV的完整方法與代碼解析

 更新時間:2026年06月02日 11:56:31   作者:LAYONTHEGROUND  
PDF?格式因其版式固定性而廣泛用于文檔交換,但也導(dǎo)致結(jié)構(gòu)化數(shù)據(jù)(如表格)難以直接抽取,本文將介紹如何使用免費(fèi)庫?Free?Spire.PDF?for?Python?解析?PDF?表格,并結(jié)合?Python?內(nèi)置?csv?標(biāo)準(zhǔn)庫完成數(shù)據(jù)導(dǎo)出,有需要的可以了解下

PDF 格式因其版式固定性而廣泛用于文檔交換,但也導(dǎo)致結(jié)構(gòu)化數(shù)據(jù)(如表格)難以直接抽取。盡管存在多種解析方案(如基于文本坐標(biāo)啟發(fā)式或 OCR),但對于具有明確邊框和單元格邊界的表格,專用表格提取器能提供更高的準(zhǔn)確度。本文將介紹如何使用免費(fèi)庫 Free Spire.PDF for Python 解析 PDF 表格,并結(jié)合 Python 內(nèi)置 csv 標(biāo)準(zhǔn)庫完成數(shù)據(jù)導(dǎo)出。

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

1. 依賴庫安裝

本次實(shí)現(xiàn)依賴 PDF 解析組件與 Python 原生庫,執(zhí)行以下命令安裝免費(fèi)版 PDF 解析組件:

pip install Spire.Pdf.Free

2. 技術(shù)說明

  • 核心依賴:spire.pdf.free 負(fù)責(zé)識別、提取 PDF 中的表格結(jié)構(gòu)與單元格數(shù)據(jù);
  • 文件導(dǎo)出:使用 Python 內(nèi)置 csv、os 標(biāo)準(zhǔn)庫完成目錄創(chuàng)建、CSV 寫入,無需額外第三方數(shù)據(jù)處理庫;
  • 適用場景:支持單頁/多頁 PDF、單頁多表格場景,可自動按頁面+表格序號拆分輸出文件;
  • 兼容性:導(dǎo)出 UTF-8 編碼 CSV,可直接用 Excel、WPS、Pandas 等工具讀取。

二、核心實(shí)現(xiàn)思路

  1. 初始化 PDF 文檔對象,加載本地 PDF 文件;
  2. 創(chuàng)建表格提取器,綁定已加載的 PDF 文檔;
  3. 遍歷 PDF 所有頁面,逐頁提取當(dāng)前頁面內(nèi)的全部表格;
  4. 針對每個表格,逐行、逐列讀取單元格文本,并做基礎(chǔ)文本清洗;
  5. 自動創(chuàng)建輸出目錄,將單張表格數(shù)據(jù)寫入獨(dú)立 CSV 文件,文件按頁面、表格編號命名;
  6. 執(zhí)行資源釋放操作,釋放 PDF 文檔占用的內(nèi)存與文件流。

三、完整代碼實(shí)現(xiàn)

該示例完整還原逐頁、逐表提取邏輯,自動創(chuàng)建輸出目錄,每個表格單獨(dú)生成 CSV 文件,附帶文本清洗邏輯:

from spire.pdf import PdfDocument, PdfTableExtractor
import csv
import os

# 初始化PDF文檔對象并加載文件
pdf = PdfDocument()
pdf.LoadFromFile("Sample.pdf")

# 創(chuàng)建PDF表格提取器
extractor = PdfTableExtractor(pdf)

# 定義輸出目錄,目錄不存在則自動創(chuàng)建
output_root = "Tables"
os.makedirs(output_root, exist_ok=True)

# 遍歷PDF每一頁
for page_index in range(pdf.Pages.Count):
    # 提取當(dāng)前頁面下所有表格
    tables = extractor.ExtractTable(page_index)
    
    # 遍歷當(dāng)前頁面中的每一個表格
    for table_index, table in enumerate(tables):
        table_data = []
        
        # 讀取表格所有行
        row_total = table.GetRowCount()
        for row in range(row_total):
            row_data = []
            # 讀取當(dāng)前行所有列
            col_total = table.GetColumnCount()
            for col in range(col_total):
                # 提取單元格文本,去除換行符、首尾空白字符
                cell_text = table.GetText(row, col).replace("\n", "").strip()
                row_data.append(cell_text)
            table_data.append(row_data)
        
        # 拼接CSV文件路徑,按 頁面-表格 編號命名
        csv_name = f"Page{page_index + 1}-Table{table_index + 1}.csv"
        csv_path = os.path.join(output_root, csv_name)
        
        # 寫入CSV文件,指定UTF-8編碼,newline避免多余空行
        with open(csv_path, "w", newline="", encoding="utf-8") as csvfile:
            writer = csv.writer(csvfile)
            writer.writerows(table_data)
        print(f"已導(dǎo)出:{csv_path}")

# 釋放PDF文檔資源
pdf.Dispose()
print("所有表格導(dǎo)出完成")

四、代碼解析

4.1 核心類說明

  • PdfDocument:PDF 文檔操作主類,LoadFromFile() 用于加載本地 PDF 文件,Pages.Count 獲取文檔總頁數(shù),Dispose() 用于釋放文件流、內(nèi)存等資源,批量處理文件時必須調(diào)用,防止內(nèi)存堆積。
  • PdfTableExtractor:專用表格提取器,依賴已加載的 PdfDocument 對象初始化;ExtractTable(page_index) 接收頁碼索引,返回當(dāng)前頁面內(nèi)所有表格對象集合。

4.2 表格數(shù)據(jù)讀取方法

  • GetRowCount():獲取當(dāng)前表格的總行數(shù);
  • GetColumnCount():獲取當(dāng)前行的總列數(shù);
  • GetText(row, col):根據(jù)行、列索引讀取單元格原始文本。

4.3 文本清洗邏輯

replace("\n", "").strip() 是實(shí)用的預(yù)處理邏輯:

  • 去除單元格內(nèi)的換行符,避免 CSV 格式錯亂;
  • 清除文本首尾空格、制表符,保證數(shù)據(jù)整潔。

4.4 CSV 寫入關(guān)鍵配置

  • encoding="utf-8":統(tǒng)一使用 UTF-8 編碼,從根源避免中文亂碼;
  • newline="":Python csv 庫專屬配置,禁止自動插入空行,保證 CSV 格式標(biāo)準(zhǔn);
  • os.makedirs(..., exist_ok=True):自動創(chuàng)建多級目錄,exist_ok=True 表示目錄已存在時不拋出異常。

4.5 文件命名規(guī)則

文件采用 Page頁碼-Table表格序號.csv 命名,可直觀區(qū)分?jǐn)?shù)據(jù)來源,方便后續(xù)文件管理與溯源。

五、拓展應(yīng)用方向

批量處理多文件:結(jié)合 os.listdir() 遍歷指定文件夾,批量讀取目錄下所有 PDF,循環(huán)調(diào)用封裝函數(shù)實(shí)現(xiàn)全量表格導(dǎo)出。

數(shù)據(jù)二次加工:導(dǎo)出 CSV 后結(jié)合 pandas 庫,實(shí)現(xiàn)數(shù)據(jù)篩選、去重、統(tǒng)計(jì)、格式轉(zhuǎn)換等數(shù)據(jù)分析操作。

表頭單獨(dú)處理:識別表格第一行為表頭,寫入 CSV 時單獨(dú)指定表頭行,提升數(shù)據(jù)可讀性。

過濾空表格:在代碼中增加數(shù)據(jù)判空邏輯,跳過無有效內(nèi)容的空白表格,減少無效文件生成。

六、知識擴(kuò)展

要將PDF表格完美地轉(zhuǎn)換成CSV,關(guān)鍵是找到匹配的解析方法。目前,camelot-pytabula-pypdfplumber是解決這類需求最核心的三個Python庫,它們各有側(cè)重,也各有適用的場景。

根據(jù)你的PDF文件類型,選擇最適合的代碼并運(yùn)行即可。

1. camelot-py:最適合有邊框的表格

這種方法對有明確線條的表格提取效果最好,安裝簡單,但依賴于OpenCV:

pip install camelot-py[cv]

下面的代碼演示了最簡潔的用法,只需幾行就能提取表格并導(dǎo)出為CSV。

import camelot
# 讀取PDF并提取表格,flavor='lattice'適用于有邊框的表格
# 可以指定pages='all'來提取所有頁面
tables = camelot.read_pdf('your_table.pdf', pages='1-3', flavor='lattice')
# 將所有提取的表格導(dǎo)出為多個CSV文件(或一個ZIP壓縮包)
tables.export('output.csv', f='csv', compress=False)
# 查看第一個提取的表格
print(tables[0].df)
# 如果只想保存第一個表格
# tables[0].to_csv('single_table.csv')

2. pdfplumber:更通用和靈活

pdfplumber 在靈活性和易用性之間取得了很好的平衡,處理各種風(fēng)格的表格。

pip install pdfplumber

對于大多數(shù)情況,extract_table() 方法已經(jīng)足夠好用。但如果遇到樣式復(fù)雜的表格,extract_tables() 配合 table_settings 參數(shù)能幫你更好地控制提取邏輯。

import csv
import pdfplumber
with pdfplumber.open("your_table.pdf") as pdf:
    # 假設(shè)表格在第一頁
    page = pdf.pages[0]
    # 智能提取表格(自動檢測)
    # 如果效果不佳,可以嘗試指定table_settings參數(shù)
    # table_settings = {"vertical_strategy": "lines", "horizontal_strategy": "lines"}
    # table = page.extract_table(table_settings=table_settings)
    table = page.extract_table()
    if table:
        with open("output.csv", "w", newline='', encoding='utf-8') as f:
            writer = csv.writer(f)
            writer.writerows(table)

pdfplumber 也支持一次性提取頁面中的所有表格。

with pdfplumber.open("your_table.pdf") as pdf:
    page = pdf.pages[0]
    tables = page.extract_tables()
    for i, table in enumerate(tables):
        if table:
            with open(f"table_{i+1}.csv", "w", newline='', encoding='utf-8') as f:
                writer = csv.writer(f)
                writer.writerows(table)

3. tabula-py:快速且功能全面

tabula-py 是Java版Tabula的Python封裝。使用前需安裝Java 8+環(huán)境并將其添加到系統(tǒng)PATH環(huán)境變量中

pip install tabula-py

它的API設(shè)計(jì)非常直接,一行命令就能完成PDF到CSV的轉(zhuǎn)換,對新手很友好。

import tabula
# 提取PDF中所有表格,并保存為CSV文件
tabula.convert_into("your_table.pdf", "output.csv", output_format="csv", pages='all')
# 提取表格到DataFrame列表,以便進(jìn)行數(shù)據(jù)處理
# df_list = tabula.read_pdf("your_table.pdf", pages='all')
# print(df_list[0])  # 打印第一個表格

七、總結(jié)

以上 Python 示例演示了如何輕松實(shí)現(xiàn) PDF 表格提取并導(dǎo)出為 CSV 文件。通過逐頁掃描、單元格清理和標(biāo)準(zhǔn) CSV 寫入,可構(gòu)建穩(wěn)定可靠的數(shù)據(jù)抽取流程。在實(shí)際集成中,開發(fā)者應(yīng)當(dāng)關(guān)注表格邊框依賴、頁面限制以及資源釋放等關(guān)鍵因素,并根據(jù)文檔特性調(diào)整文本清洗規(guī)則。該方法不依賴任何中間格式或額外解析庫,代碼結(jié)構(gòu)清晰,適用于自動化數(shù)據(jù)處理管道。

以上就是Python實(shí)現(xiàn)PDF表格轉(zhuǎn)CSV的完整方法與代碼解析的詳細(xì)內(nèi)容,更多關(guān)于Python PDF表格轉(zhuǎn)CSV的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python讀取json數(shù)據(jù)還原表格批量轉(zhuǎn)換成html

    python讀取json數(shù)據(jù)還原表格批量轉(zhuǎn)換成html

    這篇文章主要介紹了python讀取json數(shù)據(jù)還原表格批量轉(zhuǎn)換成html,由于需要對ocr識別系統(tǒng)的表格識別結(jié)果做驗(yàn)證,通過返回的json文件結(jié)果對比比較麻煩,故需要將json文件里面的識別結(jié)果還原為表格做驗(yàn)證,下面詳細(xì)內(nèi)容需要的小伙伴可以參考一下
    2022-03-03
  • python Selenium實(shí)現(xiàn)付費(fèi)音樂批量下載的實(shí)現(xiàn)方法

    python Selenium實(shí)現(xiàn)付費(fèi)音樂批量下載的實(shí)現(xiàn)方法

    這篇文章主要介紹了python Selenium實(shí)現(xiàn)付費(fèi)音樂批量下載的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Python中time與datetime模塊使用方法詳解

    Python中time與datetime模塊使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Python中time與datetime模塊使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • python運(yùn)行加速的幾種方式

    python運(yùn)行加速的幾種方式

    Python運(yùn)行的慢是歷來被詬病的,本文就來介紹一下python運(yùn)行加速的幾種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • python列表的特點(diǎn)分析

    python列表的特點(diǎn)分析

    在本篇文章里小編個大家整理的是一篇關(guān)于python列表的特點(diǎn)分析內(nèi)容總結(jié),有需要的朋友們可以學(xué)習(xí)下。
    2021-08-08
  • Python之重導(dǎo)出機(jī)制的實(shí)現(xiàn)示例

    Python之重導(dǎo)出機(jī)制的實(shí)現(xiàn)示例

    重導(dǎo)出不是Python的保留關(guān)鍵字,也不是新的語法結(jié)構(gòu),而是一種利用?import?語義實(shí)現(xiàn)的設(shè)計(jì)模式,下面就來詳細(xì)的介紹一下Python之重導(dǎo)出機(jī)制的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2026-05-05
  • Python中Socket select基本使用介紹

    Python中Socket select基本使用介紹

    本文介紹了Python中的select模塊,用于異步I/O多路復(fù)用,支持同時處理多個連接,具有一定的參考價值,感興趣的可以了解一下
    2025-12-12
  • pandas DataFrame where的實(shí)現(xiàn)示例

    pandas DataFrame where的實(shí)現(xiàn)示例

    pandas.DataFrame.where方法提供了一種靈活的方式來根據(jù)條件篩選和替換DataFrame中的元素,本文主要介紹了pandas DataFrame where的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2025-04-04
  • 快速搭建python爬蟲管理平臺

    快速搭建python爬蟲管理平臺

    如今大多數(shù)企業(yè)都離不開爬蟲,它是獲取數(shù)據(jù)的一種有效方式。但是對爬蟲有著規(guī)模量級要求的企業(yè)或個人需要同時處理不同類別的爬蟲,這會憑空增添很多附加的管理成本。因此一個成熟的爬蟲管理流程應(yīng)該包含一個管理系統(tǒng),能夠有效處理上述問題。
    2021-05-05
  • python3.6使用tkinter實(shí)現(xiàn)彈跳小球游戲

    python3.6使用tkinter實(shí)現(xiàn)彈跳小球游戲

    這篇文章主要為大家詳細(xì)介紹了python3.6使用tkinter實(shí)現(xiàn)彈跳小球游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05

最新評論

乐清市| 安陆市| 长治县| 吉木萨尔县| 蓬溪县| 茌平县| 灵武市| 聂荣县| 富阳市| 罗定市| 杭锦旗| 东乡族自治县| 改则县| 遂昌县| 邮箱| 南昌县| 平邑县| 汤阴县| 花垣县| 隆回县| 贵阳市| 珲春市| 云龙县| 开阳县| 天镇县| 商丘市| 乐清市| 蒲江县| 聂荣县| 西乌珠穆沁旗| 隆昌县| 沿河| 宁晋县| 怀仁县| 太和县| 鄂州市| 灵山县| 翁牛特旗| 昂仁县| 平潭县| 康乐县|