2011-08-11 21 views
2

私は数百のモジュールを含むPythonプロジェクトを持っています。 Python 2.6では、明示的なエンコーディング宣言がある場合を除き、ソースファイル(モジュール)のエンコーディングはASCIIでなければなりません。 非ASCII文字を含むPythonモジュールを見つける簡単な方法はありますか?私はそれらを訂正できるように。非ASCII文字を含むPythonモジュールを検索する

よろしくお願いします。

答えて

3

chardet pythonパッケージをご覧ください。同じos.walkアプローチをagfとして使用し、chardet.detectメソッドを呼び出して、ASCIIでない(または低い信頼度の)ファイルにフラグを立てることができます。

これにはエラーの余地が残っていますので、もっと確実にしたい場合は、Pythonファイルには表示されない文字(非英数字、句読点以外の文字) 。ただし、2つの7ビットのゼロパッド付きASCII文字(つまりU+16705 < - >AA)と同じ値を持つUTF-16文字のようなものは検出されません。

つまり、除外する文字が限られた数の文字セットからのものである場合、高い信頼性でそれらを見つけることができるはずです。

1

それほど高速ではありません。 UTF-8、Latin-1などのASCII互換のエンコードでは動作しますが、UTF-16では動作しません。

def find_non_ascii(packagedir): 
    for filepath in os.walk(packagedir): 
     if not filepath[-1].endswith('.py'): 
      continue 
     filepath = os.path.join(*filepath) 
     for line in open(filepath): 
      for char in line: 
       if ord(char) > 127: 
        yield filepath 
        doublebreak = True 
        break 
      else: 
       doublebreak = False 
      if doublebreak: 
       break 

または

def find_non_ascii(packagedir): 
    for filepath in os.walk(packagedir): 
     if not filepath[-1].endswith('.py'): 
      continue 
     filepath = os.path.join(*filepath) 
     try: 
      open(filepath, 'rb').read().decode('ascii') 
     except: 
      yield filepath 

編集:この第二のバージョンはおそらく高速です。

+0

ではないことを保証するには十分ではありません'ord(127)'テストでは拡張ASCII文字のみが除外されると考えてください。マルチバイトエンコーディングのchar値のセットと2つの連続した7ビットASCII文字の値との間には交差点があります。 –

1
open(filename).read().decode("ascii") 

ことがUnicodeDecodeErrorを発生させた場合、私はダナが言うように、あなたが、そこ

にいくつかの非アスキー文字を持っている、これは、ファイルがUTF-16または類似

関連する問題