2016-11-22 3 views
2

私は両方の解凍に必要とgzip圧縮されたファイルのセットをデコードし、filehookモジュール(https://docs.python.org/3/library/fileinput.html)は、両方のフックを持っていますが、私は両方に適用することができません:Python 3 fileinput:圧縮されたファイルフックとエンコードされたファイルフックの両方ですか?

が上にこれらのフックの両方を適用するための構文があります同じFileInputインスタンス?

fi = fileinput.FileInput(openhook=fileinput.hook_compressed) 
fi = fileinput.FileInput(openhook=fileinput.hook_encoded("iso-8859-1")) 

答えて

2

the sourceを見るとgzip.openbz2.openサポート符号化パラメータことを指摘し、それはあなた自身をロールバックするにはあまりにも難しいことではありません。

def hook_compressed_encoded(encoding): 
    def hook_compressed(filename, mode): 
     ext = os.path.splitext(filename)[1] 
     if ext == '.gz': 
      import gzip 
      return gzip.open(filename, mode, encoding=encoding) 
     elif ext == '.bz2': 
      import bz2 
      return bz2.open(filename, mode, encoding=encoding) 
     else: 
      return open(filename, mode, encoding=encoding) 
    return hook_compressed 

fi = fileinput.FileInput(openhook=hook_compressed_encoded('iso-8859-1')) 
+0

ValueError:引数 'encoding'はバイナリモードではサポートされていません – OrangeDog

0

いいえ、これらを結合する方法はありません。 FileInputは、rが常にテキストを意味すると仮定してrtを受け入れることを拒否するため、hook_compressedをデフォルトのutf8と一緒に使用することもできません。

唯一の解決方法は、あなた自身で書くことです。

def hook_compressed_encoded(encoding): 
    def hook(filename, mode): 
     ext = os.path.splitext(filename)[1] 
     if ext == '.gz': 
      import gzip 
      return gzip.open(filename, 'rt', encoding=encoding) 
     elif ext == '.bz2': 
      import bz2 
      return bz2.open(filename, 'rt', encoding=encoding) 
     else: 
      return open(filename, 'rt', encoding=encoding) 
    return hook 

fi = fileinput.FileInput(openhook=hook_compressed_encoded('iso-8859-1')) 
関連する問題