24

ファイルを Unicode 形式で出力するサードパーティ ツールを使用しています。ただし、ASCII にすることをお勧めします。このツールには、ファイル形式を変更するための設定がありません。

Python を使用してファイル形式全体を変換する最良の方法は何ですか?

4

8 に答える 8

44

関数を使用するだけでファイルを簡単に変換できます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'
于 2008-10-06T17:21:15.790 に答える
11

これはあなたが思っているよりも深刻な問題だと思います。ファイルを 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 は、反復や分割などの一般的な操作をすべてサポートしています。ここでは彼らに轢かれるつもりはありません。

于 2008-10-06T17:17:01.010 に答える
4

ちなみに、これらはiconvこの種の作業を行うための Linux コマンドです。

iconv -f utf8 -t ascii <input.txt >output.txt
于 2011-12-17T09:29:58.033 に答える
2

非ASCII文字をスキップしてASCII出力のみを出力したいという私の問題については、以下の解決策が非常にうまく機能しました。

    import unicodedata
    input = open(filename).read().decode('UTF-16')
    output = unicodedata.normalize('NFKD', input).encode('ASCII', 'ignore')
于 2011-06-10T21:08:02.803 に答える
2

このような:

uc = open(filename).read().decode('utf8')
ascii = uc.decode('ascii')

ただし、ASCII に変換できない文字がある場合は例外で失敗することに注意してください。UnicodeDecodeError

編集: Pete Karl が指摘したように、Unicode から ASCII への 1 対 1 のマッピングはありません。したがって、一部の文字は、情報を保持する方法で変換することはできません。さらに、標準 ASCII は多かれ少なかれ UTF-8 のサブセットであるため、実際にはデコードを行う必要さえありません。

于 2008-10-06T17:18:04.627 に答える
2

以下は、エンコード変換を行う単純な (そしてばかげた) コードです。入力ファイルは 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をチェックしてみてください。

于 2008-10-06T17:24:48.933 に答える
0

他のポスターが指摘しているように、ASCIIはユニコードのサブセットです。

ただし、次の場合:

  • レガシーアプリを持っている
  • そのアプリのコードを制御しません
  • 入力がASCIIサブセットに分類されることを確認してください

次に、以下の例はそれを行う方法を示しています。

mystring = u'bar'
type(mystring)
    <type 'unicode'>

myasciistring = (mystring.encode('ASCII'))
type(myasciistring)
    <type 'str'>
于 2009-12-15T09:12:38.657 に答える
0

「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 で表現できない文字が含まれていると、テキストが壊れてしまいます。

于 2008-10-06T20:24:46.233 に答える