ファイルを Unicode 形式で出力するサードパーティ ツールを使用しています。ただし、ASCII にすることをお勧めします。このツールには、ファイル形式を変更するための設定がありません。
Python を使用してファイル形式全体を変換する最良の方法は何ですか?
関数を使用するだけでファイルを簡単に変換できますunicode
が、ASCII に相当するものがない Unicode 文字で問題が発生します。
このブログでは、モジュールを推奨していunicodedata
ます。このモジュールは、直接対応する ASCII 値なしで文字を大まかに変換するようです。
>>> title = u"Klüft skräms inför på fédéral électoral große"
通常、に変換されます
Klft skrms infr p fdral lectoral groe
これはかなり間違っています。ただし、unicodedata
モジュールを使用すると、結果は元のテキストにはるかに近くなります。
>>> import unicodedata
>>> unicodedata.normalize('NFKD', title).encode('ascii','ignore')
'Kluft skrams infor pa federal electoral groe'
これはあなたが思っているよりも深刻な問題だと思います。ファイルを Unicode から ASCII に単純に変更するのは簡単ですが、すべての Unicode 文字を妥当な ASCII 対応文字に変換することは別の作業です (多くの文字は両方のエンコーディングでは利用できません)。
この Python Unicode チュートリアルでは、ASCII に変換された Unicode 文字列がどうなるかについてよりよく理解できるかもしれません: http://www.reportlab.com/i18n/python_unicode_tutorial.html
サイトからの有用な引用は次のとおりです。
Python 1.6 は、エンコーディングを指定できる「unicode」組み込み関数も取得します。
> >>> unicode('hello') u'hello'
> >>> unicode('hello', 'ascii') u'hello'
> >>> unicode('hello', 'iso-8859-1') u'hello'
> >>>
「Hello」の文字は 3 つのエンコーディングすべてに共通であるため、これら 3 つすべてが同じものを返します。
ここで、ASCII 以外のヨーロッパのアクセントで何かをエンコードしてみましょう。コンソールに表示される内容は、オペレーティング システムのロケールによって異なる場合があります。Windows では、ISO-Latin-1 を入力できます。
> >>> a = unicode('André','latin-1')
> >>> a u'Andr\202'
鋭い文字 e を入力できない場合は、明確な文字列 'Andr\202' を入力できます。
Unicode は、反復や分割などの一般的な操作をすべてサポートしています。ここでは彼らに轢かれるつもりはありません。
ちなみに、これらはiconv
この種の作業を行うための Linux コマンドです。
iconv -f utf8 -t ascii <input.txt >output.txt
非ASCII文字をスキップしてASCII出力のみを出力したいという私の問題については、以下の解決策が非常にうまく機能しました。
import unicodedata
input = open(filename).read().decode('UTF-16')
output = unicodedata.normalize('NFKD', input).encode('ASCII', 'ignore')
このような:
uc = open(filename).read().decode('utf8')
ascii = uc.decode('ascii')
ただし、ASCII に変換できない文字がある場合は例外で失敗することに注意してください。UnicodeDecodeError
編集: Pete Karl が指摘したように、Unicode から ASCII への 1 対 1 のマッピングはありません。したがって、一部の文字は、情報を保持する方法で変換することはできません。さらに、標準 ASCII は多かれ少なかれ UTF-8 のサブセットであるため、実際にはデコードを行う必要さえありません。
以下は、エンコード変換を行う単純な (そしてばかげた) コードです。入力ファイルは UTF-16 であると想定しています (ただし、そうすべきではありません) (Windows ではこれを単に 'Unicode' と呼んでいます)。
input_codec = 'UTF-16'
output_codec = 'ASCII'
unicode_file = open('filename')
unicode_data = unicode_file.read().decode(input_codec)
ascii_file = open('new filename', 'w')
ascii_file.write(unicode_data.write(unicode_data.encode(output_codec)))
Unicode ファイルに ASCII 文字以外の文字がある場合、これは機能しないことに注意してください。次のようにして、認識されない文字を「?」に変換できます。
ascii_file.write(unicode_data.write(unicode_data.encode(output_codec, 'replace')))
より簡単な選択については、ドキュメントを参照してください。もっと高度なことをする必要がある場合は、Python Cookbookの The UNICODE Hammerをチェックしてみてください。
他のポスターが指摘しているように、ASCIIはユニコードのサブセットです。
ただし、次の場合:
次に、以下の例はそれを行う方法を示しています。
mystring = u'bar'
type(mystring)
<type 'unicode'>
myasciistring = (mystring.encode('ASCII'))
type(myasciistring)
<type 'str'>
「Unicode」ファイル形式がないことに注意することが重要です。Unicode は、いくつかの異なる方法でバイトにエンコードできます。最も一般的なのは UTF-8 または UTF-16 です。サードパーティのツールが出力しているものを知る必要があります。それがわかれば、異なるエンコーディング間の変換は非常に簡単です。
in_file = open("myfile.txt", "rb")
out_file = open("mynewfile.txt", "wb")
in_byte_string = in_file.read()
unicode_string = bytestring.decode('UTF-16')
out_byte_string = unicode_string.encode('ASCII')
out_file.write(out_byte_string)
out_file.close()
他の返信で述べたように、encode メソッドにエラー ハンドラを提供したいと思うでしょう。エラー ハンドラとして 'replace' を使用するのは簡単ですが、テキストに ASCII で表現できない文字が含まれていると、テキストが壊れてしまいます。