私は数百のモジュールを含むPythonプロジェクトを持っています。 Python 2.6では、明示的なエンコーディング宣言がある場合を除き、ソースファイル(モジュール)のエンコーディングはASCIIでなければなりません。 非ASCII文字を含むPythonモジュールを見つける簡単な方法はありますか?私はそれらを訂正できるように。非ASCII文字を含むPythonモジュールを検索する
よろしくお願いします。
私は数百のモジュールを含むPythonプロジェクトを持っています。 Python 2.6では、明示的なエンコーディング宣言がある場合を除き、ソースファイル(モジュール)のエンコーディングはASCIIでなければなりません。 非ASCII文字を含むPythonモジュールを見つける簡単な方法はありますか?私はそれらを訂正できるように。非ASCII文字を含むPythonモジュールを検索する
よろしくお願いします。
chardet pythonパッケージをご覧ください。同じos.walk
アプローチをagfとして使用し、chardet.detect
メソッドを呼び出して、ASCIIでない(または低い信頼度の)ファイルにフラグを立てることができます。
これにはエラーの余地が残っていますので、もっと確実にしたい場合は、Pythonファイルには表示されない文字(非英数字、句読点以外の文字) 。ただし、2つの7ビットのゼロパッド付きASCII文字(つまりU+16705
< - >AA
)と同じ値を持つUTF-16文字のようなものは検出されません。
つまり、除外する文字が限られた数の文字セットからのものである場合、高い信頼性でそれらを見つけることができるはずです。
それほど高速ではありません。 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
編集:この第二のバージョンはおそらく高速です。
open(filename).read().decode("ascii")
ことがUnicodeDecodeErrorを発生させた場合、私はダナが言うように、あなたが、そこ
にいくつかの非アスキー文字を持っている、これは、ファイルがUTF-16または類似
ではないことを保証するには十分ではありません'ord(127)'テストでは拡張ASCII文字のみが除外されると考えてください。マルチバイトエンコーディングのchar値のセットと2つの連続した7ビットASCII文字の値との間には交差点があります。 –