2012-03-02 6 views
5

私はさまざまな外部アプリケーションからデータを書き出すPython 2.7プログラムを持っています。私はファイルに書き込むときに、文字列に書き込まれる文字列に.decode(errors="ignore")を追加するまで、私は絶えず例外に噛まれます。 (FWIWでファイルを開くと、mode="wb"はこれを修正しません)Python 2.7プログラムのすべての文字列のデフォルトをdecode(errors = "ignore")することはできますか?

「このスコープのすべての文字列でエンコードエラーを無視する」と言う方法はありますか?

答えて

5

組み込み型のメソッドを再定義することはできません。errorsパラメータのデフォルト値をstr.decode()に変更することはできません。しかし、望ましい動作を達成するための他の方法もあります。

少しよりよい方法:独自のdecode()関数を定義:

def decode(s, encoding="ascii", errors="ignore"): 
    return s.decode(encoding=encoding, errors=errors) 

さて、あなたはdecode(s)代わりのs.decode()を呼び出す必要がありますが、それがあまりにも悪くはない、それはないですか?

ハック:あなたがerrorsパラメータのデフォルト値を変更することはできませんが、デフォルトerrors="strict"のハンドラが何をするか上書きすることができます。

import codecs 
def strict_handler(exception): 
    return u"", exception.end 
codecs.register_error("strict", strict_handler) 

これは、本質的に動作を変更しますerrors="strict"を標準"ignore"の動作に変換します。これはグローバルな変更であり、インポートするすべてのモジュールに影響します。

この2つの方法のどちらもお勧めしません。本当の解決策はエンコーディングを正しく行うことです。 (私は、これは必ずしも可能ではないことを十分承知している)

1

私はあなたのセットアップが正確に何であるかわからないんだけど、あなたはstrからクラスを派生し、そのデコード方法オーバーライドすることができます。

class easystr(str): 
    def decode(self): 
     return str.decode(self, errors="ignore") 

あなたが​​にすべての着信文字列を変換した場合、エラーは無視されます。

line = easystr(input.readline()) 

は、文字列は損失になることはありませんユニコード、に変換をデコードし、言いました。あなたの文字列がどのエンコーディングを使用しているか把握して、の引数をdecodeにしてください。それはより良い解決策になります(そして、上記のようにデフォルトにすることもできます)。

もう一度試してみるべきことは、のデータを別様に読み取ることです。このようにそれを行うとデコードエラーがうまく消えることがあります。

import codecs 
input = codecs.open(filename, "r", encoding="latin-1") # or whatever 
関連する問題