要讀取 .pkl 檔,結果遇到各種狀況,在網路上查了許多資料後終於解決了!
在這邊簡單做個過程紀錄~
(如果想直接跳結果的話,可以 ctrl+F,搜尋:gzip.open() XD)
2021.01.21 更新 pickle.loads(f.read()) 方法
一開始其實是先用了 pandas 中的 pd.read_pickle
來讀取
結果報錯了,也沒查到什麼有效的解決方法
pd.read_pickle(filepath)
UnpicklingError: invalid load key, '\x1f'.
既然條條大路通羅馬!那就試試別的方法吧~
所以後面就改成嘗試用 pickle 中的 pickle.load
來讀取,程式碼如下:
print(os.path.isfile(filepath))
with open(filepath) as f:
data = pickle.load(f)
結果這邊第一個問題就出現了
UnicodeDecodeError: 'cp950' codec can't decode byte 0x8b in position 1: illegal multibyte sequence
看來是編碼上的問題呀!
所以後來在 open 裡面設定 encoding
的方式 [1]
這邊嘗試了各種編碼方式,包括 UTF-8
、cp950
、big5hkscs
、ISO-8859-1
在網路上查到有人也是在解決讀檔問題 [2],試了 gbk
和gb1830
,不過他讀取的是 .txt 檔,但也順便參考了他的方法,增加了這一條 errors='ignore'
with open(filepath, encoding='UTF-8', errors='ignore') as f:
data = pickle.load(f)
不過用不同 encoding
報的錯大同小異
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
增加 errors='ignore'
後,又跑出另一個錯
TypeError: a bytes-like object is required, not 'str'
雖然沒有去深究這個錯和增加上面那條的關係,不過這邊到是給了個 bytes-like object 的線索![3]
所以在讀取時多設定了 rb
意思是:read binary(r
、rb
、w
、wb
之間的差異可以參考 [4])
而直接加上 rb
後又依序報這兩個錯,所以後來就只留下 rb
with open(filepath, 'rb', encoding='UTF-8', errors='ignore') as f:
data = pickle.load(f)
ValueError: binary mode doesn't take an encoding argument
ValueError: binary mode doesn't take an errors argument
結果..... 怎麼回到了最一開始用 pd.read_pickle
時就出現的錯誤啊 @@
with open(filepath, 'rb') as f:
data = pickle.load(f)
UnpicklingError: invalid load key, '\x1f'.
所以繞了一大圈,結果還是要回頭解決原本的問題(人森啊....該面對的還是得面對 XD)
後來看到有人在解 pickle 壓縮檔(.gpkl)的時候,用了 gzip
的方法 [5]
開啟檔案時,改成用 gzip.open()
import gzip
with gzip.open(filepath, 'rb') as f:
data = pickle.load(f)
結果成功了!!!
2021.01.21 更新
後來用上述方法要讀取 .pickle 檔案的時候,報了這個錯:
OSError: Not a gzipped file (b'\x80\x04')
試了[6]的方法,當中的「解決方法2」在我的情況是可行的:pickle.loads(f.read())
with open(filepath, 'rb') as f:
data = pickle.loads(f.read())
過程中感覺其實還有滿多有趣的地方可以探討,不過就先記錄下來,留待之後有機會的時候再去研究~
如果有任何問題歡迎留言討論,文中錯誤的地方還請不吝指正,謝謝!
[1] 解決 Python 中 UnicodeDecodeError: 'cp950' codec can't decode
[2] python读取中编码错误(illegal multibyte sequence)
[3] Pickle: TypeError: a bytes-like object is required, not 'str' [duplicate]
[4] python打开文件时'w'与'wb'的区别,'r'与'rb'的区别
[5] What causes the error “_pickle.UnpicklingError: invalid load key, ' '.”?
[6] TypeError: file must have 'read' and 'readline' attributes或者UnicodeDecodeError: