很多行政工作如果規畫、整合得當是可以不用花那麼多時間的;反之,沒有整合,就是整死人。記得以前看學校幹事們忙著在電腦上剪剪貼貼資料,忙得人仰馬翻的,總覺得,為什麼運用電腦了,還需要這樣子「愚公移山」;關係夠好,看不下去了,就會幫忙弄些小工具,來處理資料。前幾天同事問我有沒有辦法將別人 PDF 檔中的表格資料匯出到試算表,並且將列變成行、直變橫?PDF 中的表格長這樣子:
第一個想法,Python 應該可以!幾個程序能做到,轉檔應該就有望了:
- 以 Python 讀取 PDF 的資料,並解析出表格文字內容。
- 去掉不要的資料。
- 將表格內容進行旋轉(transpose)。
由 PDF 讀入表格資料
讓 Python 讀入 PDF 資料,並解析出表格文字內容,我試了:
- tabula-py
- Camelot (camelot-py)
測試過,感覺 Camelot 比較可以跟後續的資料旋轉接軌,就專心研究 camelot-py 了。
關於 camelot-py 的安裝
在 Windows 上使用 camelot-py 大概會遇到這個錯誤訊息:
OSError: Ghostscript is not installed. You can install it using the instructions here: https://camelot-py.readthedocs.io/en/master/user/install-deps.html
主要是因為讀入 PDF 檔案時,如果沒有指定「backend」參數,它預設會使用預設值「backend="ghostscript"」,而大部份的電腦中可能沒安裝ghostscript,有興趣可以參考錯誤訊息中的說明文件:
因為 ghostscript 的安裝顯得較複雜,所以我選擇在 Windows 中用「backend="poppler"」,只要先執行以下兩行指令安裝 pdftopng 跟 opencv 即可:
pip install pdftopng
pip install opencv-python
倒過來,如果在 Google Colab 的環境中,安裝 pdftopng 反而會累死人(我是沒成功),安裝 ghostscript 容易多了:
!apt install python3-tk ghostscript
!pip install ghostscript
關於 camelot-py 的使用
import camelot
pdfTable = camelot.read_pdf(pdf_file_name, pages=pages)
如果不是用 ghostscript,就用:
import camelot
pdfTable = camelot.read_pdf(pdf_file_name, pages=pages, backend="poppler")
接下來我們就可以針對 pdfTable 來存取(轉換)資料,詳情可以參考 camelot-py 中,有關 Table 的說明:
我使用 pdfTable[0].df ,將抓到資料轉為 pandas.DataFrame 的格式,方便後續的資料處理。
資料處理
前面提到利用 pdfTable[0].df ,可以將指定頁資料轉為 pandas.DataFrame 物件,假設將內容指定給變數 df,我想針對 df 再進行一些處理:
- 只取出指定的列(之後會旋轉為欄)。
- 去掉原始資料最右側的「小計」那欄。
- 暫存原始資料最左側欄的資料(最後為試算表中的欄位名稱)。
- 去掉流水號不是數字(空格或是「以下空白」)的資料。
- 將一頁頁資料合併在一起
pandas 的 DataFrame,在存取資料時,幾個關鍵詞跟對象有關:
- index
- colunms
- axis
幾個關鍵詞跟過濾、移動指標有關:
- isin
- iloc
- loc
資料的刪除、旋轉、合併的關鍵詞:
- drop
- transpose
- concat
詳細的說明都可以在pandas的網站查到:
為了寫這個資料轉換的工具,第一次玩 Camelot 和 pandas,雖然還沒有很深入研究,但工具有了初步的成果了,將它移植到 Google Colab 中,想玩玩看(哈!不能提供有個資的 PDF 啦!) ,或是對原始碼有興趣(別嫌我,醜是一定的,就好玩,亂寫的),網址如下:
pdf-to-excel.ipynb 的截圖 |
改天再補記一下曾經卡關很久的地方。
沒有留言:
張貼留言