【Python】讀取與寫入 xlsx 檔案

那天,我媽的同事傳了份檢驗結果文件給她,但格式超級奇怪,既不是人工閱讀的文件格式、也不是資料系統的處理格式。我媽想把它轉成資料系統格式,可偏偏 Excel 的轉置、公式什麼的都沒辦法處理,只能人工處理。粗估下來,一份小資料大概 2 小時跑不掉。

我看了一下資料內容,是可以抓到一些規律的,因此打算寫程式幫她轉了,如果一切順利 15 分鐘就可以解決了。漏氣的是,第一關讀檔就卡住,我之前好像還沒有讀過 Excel 檔的文件。

一般讀檔案

原本想說它跟 CSV 檔案類似,可以用一般讀檔的方式讀進來,結果一開始就吃鱉了。

1
2
3
with open("原料年檢資料.xlsx", "r", encoding="utf-8") as fr:
   for line in fr :
      print(line)

立刻給了我個編碼問題,看來不能偷吃步了,只好來研究怎麼讀 Excle 檔了。

1
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x90 in position 16: invalid start byte

Pandas 讀檔

拜了一下大神,發現有 openpyxl、 xlrd、 Pandas 幾種函式庫有支援 xlsx 的讀寫。最決定用 Pandas,因為我平常資料操作都是用它,就不用另外裝函式庫了。

1
2
3
4
5
6
7
import pandas as pd
df=pd.read_excel("原料年檢資料.xlsx")
# 印出前四筆資料
df.head(4)

# 轉成 numpy.ndarray 格式
nmp=df.values

讀進來之後就變 Pandas 格式了,可以接續一般的操作了。不過我在執行程式碼時遇到下面的錯誤訊息:

1
Pandas pd.read_excel giving ImportError: Install xlrd >= 0.9.0 for Excel support

看起來是安裝 xlrd 0.9.0 以上的版本就可以了,結果還是得裝套新的函式庫:

1
$pip install xlrd

Pandas 寫檔

至於寫檔的部分我其實偷懶,寫了 CSV 出去,反正給 CSV 我媽他們系統也可以接受。

不過為了寫網誌,還是稍微看了一下如何寫檔,算是留個紀錄方便日後找查,絕對不是我不想再多裝個函式庫 XDDD

1
2
3
4
5
6
# 因為我要寫中文檔案 engine 要換成 openpyxl
writer = pd.ExcelWriter('pandas_simple.xlsx', engine='openpyxl')

# df 指要寫出的內容
df.to_excel(writer, sheet_name='Sheet1')
writer.save()

看這段程式碼沒意外還是得安裝 openpyxl:

1
$pip install openpyxl

參考資料

  1. M.C. Shih (2019-01-02)。[Python]讀取與寫入xlsx檔案 。檢自 M.C. Shih (2020-07-31)。

更新紀錄

最後更新日期: 2020-12-21
  • 2020-12-21 發布
  • 2020-09-12 完稿
  • 2020-09-11 起稿