我需要從通常使用gzip壓縮的一些文件中讀取二進制數據。我已成功使用的gzip模塊讀取數據:Python:從文件中讀取數據有時會被壓縮,有時候不會
def decode(self, filename):
with gzip.open(filename, 'rb') as f:
# ReadData
但是有時文件沒有壓縮在這種情況下,我得到一個IOError(因爲文件沒有gzip頭)。
我可以這樣做:
try:
f = gzip.open(filename, 'rb')
f._read_gzip_header()
f.rewind()
except IOError:
f.close()
f = open(filename, 'rb')
with f as gz:
#ReadData
,但我不覺得這是解決它的好方法。
我正在尋找一個優雅的解決方案來解決這個問題。我將爲幾種文件類型編寫幾個「解碼」函數。我考慮的解決方案是創建一個GzipFile的子類來處理它,但我相信可能有更好的方法。
我使用Python 2.7
預先感謝您的任何建議!
您的解決方案有什麼問題?我不會關閉文件,然後立即重新打開它,但用try/except處理潛在的IOError是完全正確的。只是嘗試讀取它作爲gzip,除了'IOError'讀作純文本,除了'IOError'回溯。然後乾淨地處理所有的處理,處理代碼不知道文件是如何打開的。 –
那麼,我的解決方案可能沒有什麼問題(我對Python的經驗並不豐富,有時候我懷疑什麼是好的/錯誤的)。我不喜歡我的解決方案的原因是我至少會編寫6個解碼函數(針對6種不同的文件類型),我認爲可能有更好的方法可以避免在每個函數中寫入try-except塊。但感謝您的評論。 – user3466240
如果問題是您不想複製代碼,那麼只需創建一個新的上下文管理器,無論輸入是否壓縮,都會生成一個具有未壓縮數據的文件類對象。下面是一個[上下文管理器'named_pipe()'的代碼示例,它封裝了創建命名管道](http://stackoverflow.com/a/22435492/4279) – jfs