python库Camelot从pdf抽取表格数据以及python库camelot安装及使用中的一些注意事项
一、python庫camelot安裝及使用中的一些注意事項
1)camelot方法有兩種解析模式:流解析(stream)、格子解析(lattice),其中格子解析能夠保留表格完整的樣式,對于復雜表格來說要優于流解析模式。同時,camelot方法默認格子解析(lattice),而采用這種解析方式,需要安裝ghostscript。因此,僅通過pip命令安裝的camelot,代碼運行時通常會報錯。需要下載ghostscript.exe并安裝。安裝后,經測試,并不需要在代碼中import ghostscript。
2)camelot輸出格式如果選擇csv格式,可能存在中文亂碼問題,需要用文本編輯器將導出的csv文件編碼改為ansi格式。
如果想直接保存為excel格式,需要xlwt模塊支持,pip安裝xlwt后tables.export(‘文件名.xls’,f = ‘excel’)即可輸出為excel格式。
3)后來在另外一臺電腦上安裝camelot庫時出現了一個奇葩的問題,程序運行報錯。反復檢查才發現原因。首先是在這臺電腦上,我是按照印象輸入pip install camelot,也安裝成功。但代碼運行錯誤。經查閱,正確命令(或者說版本)是pip install camelot-py[cv]。
所以我先uninstall前面安裝的camelot,又重新按照正確的命令安裝camelot-py[cv],但代碼運行時又提示import xlwt有問題,在python庫中檢查了下,xlwt文件是正常的,找了半天沒找到原因。后來單獨卸載xlwt,然后重新pip安裝xlwt,發現xlwt的版本號由0.7變為1.3,然后一切就正常了。估計是之前錯誤安裝了camelot的版本,導致順帶安裝的xlwt版本過低,無法兼容python3.6.5。
4)camelot開始時一切正常,但處理一個pdf文件時突然報錯:pdfminer.psparser.SyntaxError: Invalid dictionary construct: [/‘Type’, /‘Font’, /‘Subtype’, /‘Type0’, /‘BaseFont’, /b"b’", /“ABCDEE+\xcb\xce\xcc\xe5’”, /‘Encoding’, /‘Identity-H’, /‘DescendantFonts’, PDFObjRef:11, /‘ToUnicode’, PDFObjRef:19]
經百度,找到解決方案,修改了pandas和PyPDF2模塊的三處源碼,恢復正常。具體修改內容見python爬蟲處理在線預覽的pdf文檔https://link.csdn.net/?target=https%3A%2F%2Fwww.cnblogs.com%2FEeyhan%2Farchive%2F2019%2F12%2F30%2F12111371.html
二 、 python庫Camelot從pdf抽取表格數據
原文鏈接:https://blog.csdn.net/xc_zhou/article/details/99242995
Camelot: 一個友好的PDF表格數據抽取工具
一個python命令行工具,使任何人都能很輕松的從PDF文件中抽取表格數據。
安裝 Camelot
安裝非常簡單! 在安裝相關的依賴后,可以直接使用pip安裝。
$?pip?install?camelot-py- 1
怎樣使用Camelot
使用Camelot從PDF文檔提取數據非常簡單
為什么使用Camelot
- Camelot允許你通過調整設置項來精確控制數據的提取過程
- 可以根據空白和精度指標來判斷壞的表格,并丟棄,而不必手動檢查
- 每一個表格數據是一個panda的dataframe,從而可以很方便的集成到ETL和數據分析工作流中
- 可以把數據導出為各種不同的格式比如 CSV、JSON、EXCEL、HTML
首先,讓我們看一個簡單的例子:eg.pdf,整個文件只有一頁,這一頁中只有一個表格,如下:
使用以下Python代碼就可以提取該PDF文件中的表格:
import camelot從PDF文件中提取表格
tables = camelot.read_pdf(‘E://eg.pdf’, pages=‘1’, flavor=‘stream’)
表格信息
print(tables)
print(tables[0])
表格數據
print(tables[0].data)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
輸出結果為:
<TableList n=1> <Table shape=(4, 4)> [['ID', '姓名', '城市', '性別'], ['1', 'Alex', 'Shanghai', 'M'], ['2', 'Bob', 'Beijing', 'F'], ['3', 'Cook', 'New York', 'M']]- 1
- 2
- 3
分析代碼,camelot.read_pdf()為camelot的從表格中提取數據的函數,輸入的參數為PDF文件的路徑,頁碼(pages)和表格解析方法(有stream和lattice兩個方法)。對于表格解析方法,默認的方法為lattice,而stream方法默認會把整個PDF頁面當做一個表格來解析,如果需要指定解析頁面中的區域,可以使用table_area這個參數。
camelot模塊的便捷之處還在于它提供了將提取后的表格數據直接轉化為pandas,csv,JSON,html的函數,如tables[0].df,tables[0].to_csv()函數等。我們以輸出csv文件為例:
import camelot從PDF文件中提取表格
tables = camelot.read_pdf(‘E://eg.pdf’, pages=‘1’, flavor=‘stream’)
將表格數據轉化為csv文件
tables[0].to_csv(‘E://eg.csv’)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
得到的csv文件如下:
例2
在例2中,我們將提取PDF頁面中的某一區域的表格的數據。PDF文件的頁面(部分)如下:
為了提取整個頁面中唯一的表格,我們需要定位表格所在的位置。PDF文件的坐標系統與圖片不一樣,它以左下角的頂點為原點,向右為x軸,向上為y軸,可以通過以下Python代碼輸出整個頁面的文字的坐標情況:
import camelot從PDF中提取表格
tables = camelot.read_pdf(‘G://Statistics-Fundamentals-Succinctly.pdf’, pages=‘53’,
flavor=‘stream’)
繪制PDF文檔的坐標,定位表格所在的位置
tables[0].plot(‘text’)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
輸出結果為:
UserWarning: No tables found on page-53 [stream.py:292]- 1
整個代碼沒有找到表格,這是因為stream方法默認將整個PDF頁面當作表格,因此就沒有找到表格。但是繪制的頁面坐標的圖像如下:
仔細對比之前的PDF頁面,我們不難發現,表格對應的區域的左上角坐標為(50,620),右下角的坐標為(500,540)。我們在read_pdf()函數中加入table_area參數,完整的Python代碼如下:
import camelot識別指定區域中的表格數據
tables = camelot.read_pdf(‘G://Statistics-Fundamentals-Succinctly.pdf’, pages=‘53’,
flavor=‘stream’, table_area=[‘50,620,500,540’])
繪制PDF文檔的坐標,定位表格所在的位置
table_df = tables[0].df
print(type(table_df))
print(table_df.head(n=6))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
輸出的結果為:
<class 'pandas.core.frame.DataFrame'>0 1 2 3 0 Student Pre-test score Post-test score Difference 1 1 70 73 3 2 2 64 65 1 3 3 69 63 -6 4 … … … … 5 34 82 88 6- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
總結
在具體識別PDF頁面中的表格時,除了指定區域這個參數,還有上下標、單元格合并等參數,詳細地使用方法可參考camelot官方文檔網址:https://camelot-py.readthedocs.io/en/master/
參考:https://www.php.cn/python-tutorials-412223.html
https://mp.weixin.qq.com/s?__biz=MjM5NzU0MzU0Nw==&mid=2651380263&idx=1&sn=514485e8c4fe820834bacbcccfbb4ae9&chksm=bd2411338a539825977b2ab6d6e7a1fd86dfe0c85ba54a50d1472c309f7b1efdc164d1da4f96&mpshare=1&scene=23&srcid=0520POo6Bt0M0FUTbhnwNptJ#rd
總結
以上是生活随笔為你收集整理的python库Camelot从pdf抽取表格数据以及python库camelot安装及使用中的一些注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 判断一个点(坐标)是否在一
- 下一篇: Overleaf v2 评测