iT邦幫忙

1

python 中 pickle 讀檔問題的解決方法

yaxuan 2020-11-16 23:51:3815838 瀏覽
  • 分享至 

  • xImage
  •  

前言

要讀取 .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-8cp950big5hkscsISO-8859-1
在網路上查到有人也是在解決讀檔問題 [2],試了 gbkgb1830,不過他讀取的是 .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(rrbwwb之間的差異可以參考 [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())

後記

過程中感覺其實還有滿多有趣的地方可以探討,不過就先記錄下來,留待之後有機會的時候再去研究~

如果有任何問題歡迎留言討論,文中錯誤的地方還請不吝指正,謝謝!

References

[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:


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言