2

100 個のファイルがあり、chardet によると、各ファイルは次のいずれかでエンコードされています。

['UTF-8', 'ascii', 'ISO-8859-2', 'UTF-16LE', 'TIS-620', 'utf-8', 'SHIFT_JIS', 'ISO-8859-7']

ファイルのエンコーディングを知っているので、どのエンコーディングでファイルを開くかを知っています。

すべてのファイルを ascii のみに変換したい。-また、 や などのさまざまなバージョンの文字'をプレーンな ASCIIに変換したいと考えています。たとえば、b"\xe2\x80\x94".decode("utf8")に変換する必要があります-。最も重要なことは、テキストが読みやすいことです。don t私は例を望んでいませんが、don't代わりに。

どうすればこれを行うことができますか?

これを解決するには、Python 2 または 3 を使用できます。

これは私が Python2 で得た限りです。そもそもASCII以外の文字が続く行を検出しようとしています。

for file_name in os.listdir('.'):
        print(file_name)
        r = chardet.detect(open(file_name).read())
        charenc = r['encoding']
        with open(file_name,"r" ) as f:
            for line in f.readlines():
              if line.decode(charenc) != line.decode("ascii","ignore"):
                print(line.decode("ascii","ignore"))

これにより、次の例外が発生します。

    if line.decode(charenc) != line.decode("ascii","ignore"):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_16_le.py", line 16, in decode
    return codecs.utf_16_le_decode(input, errors, True)
UnicodeDecodeError: 'utf16' codec can't decode byte 0x0a in position 6: truncated data
4

1 に答える 1

6

.readlines()マルチバイト行を含むバイナリ ファイルを使用しないでください。UTF-16 (リトルエンディアン) では、改行は0A(ASCII では改行) と00(NULL) の 2 バイトとしてエンコードされます。これらの 2 バイトの最初.readlines()の部分で分割され、デコードするデータが不完全になります。

ioデコードを容易にするために、ライブラリを使用してファイルを再度開きます。

import io

for file_name in os.listdir('.'):
    print(file_name)
    r = chardet.detect(open(file_name).read())
    charenc = r['encoding']
    with io.open(file_name, "r", encoding=charenc) as f:
        for line in f:
            line = line.encode("ascii", "ignore"):
            print line

特定の Unicode コードポイントを ASCII 対応の文字に置き換えるには、コードポイントをコードポイントまたは Unicode 文字列にマッピングする辞書を使用し、line.translate()最初に呼び出します。

charmap = {
    0x2014: u'-',   # em dash
    0x201D: u'"',   # comma quotation mark, double
    # etc.
}

line = line.translate(charmap)

16 進数の整数リテラルを使用して、ここからマップする Unicode コードポイントを定義しました。ディクショナリの値は、Unicode 文字列、整数 (コードポイント)、またはNoneそのコードポイントを完全に削除する必要があります。

于 2013-10-28T21:10:34.150 に答える