4

特殊文字(チェコ語のアルファベット)を使用して、いくつかのdocxファイル(UTF-8でエンコードされたXML)を解析してきました。stdoutに出力しようとすると、すべてがスムーズに進みますが、ファイルにデータを出力できません。

トレースバック(最後の最後の呼び出し):
ファイル "./test.py"、行360、
ofile.write(u'\ t \ t \ t \ t \ t \ n')
UnicodeEncodeError:'ascii'コーデックはできません位置37の文字u'\xed'をエンコードします:序数が範囲内にありません(128)

word変数を明示的にユニコードタイプ(返されたユニコード)にキャストしましたがtype(word)、それをエンコードしようとしましたが、.encode('utf-8)それでもこのエラーで立ち往生しています。

これが現在のコードのサンプルです。

for word in word_list:
    word = unicode(word)
    #...
    ofile.write(u'\t\t\t\t\t<feat att="writtenForm" val="'+word+u'"/>\n')
    #...

私も次のことを試しました:

for word in word_list:
    word = word.encode('utf-8')
    #...
    ofile.write(u'\t\t\t\t\t<feat att="writtenForm" val="'+word+u'"/>\n')
    #...

これら2つの組み合わせでさえ:

word = unicode(word)
word = word.encode('utf-8')

私はちょっと必死だったので、変数内の単語をエンコードしようとしましたofile.write()

ofile.write(u'\t\t\t\t\t<feat att="writtenForm" val="'+word.encode('utf-8')+u'"/>\n')

私が間違っていることのヒントをいただければ幸いです。

4

4 に答える 4

11

ofile文字列を書き込んでいるバイトストリームです。したがって、バイト文字列にエンコードすることで間違いを処理しようとします。これは、ASCII文字でのみ一般的に安全です。word非ASCII文字が含まれているため、失敗します。

>>> open('/dev/null', 'wb').write(u'ä')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 0:
                    ordinal not in range(128)

、のようなモード、および明示的なエンコーディングでファイルofileを開くことにより、テキストストリームを作成します。io.open'wt'

>>> import io
>>> io.open('/dev/null', 'wt', encoding='utf-8').write(u'ä')
1L

codecs.openまたは、ほぼ同じインターフェイスで使用することも、すべての文字列を。を使用して手動でエンコードすることもできますencode

于 2012-11-22T12:13:41.807 に答える
2

Phihagの答えは正しいです。明示的なエンコーディングを使用して、Unicodeを手動でバイト文字列に変換することを提案したいだけです。

ofile.write((u'\t\t\t\t\t<feat att="writtenForm" val="' +
             word + u'"/>\n').encode('utf-8'))

(多分あなたはそれが高度な魔法や黒魔術のようなものの代わりに基本的なメカニズムを使ってどのように行われるのか知りたいでしょうio.open。)

于 2012-11-22T12:32:59.453 に答える
2

Word 文書 (.docx) への書き込み時に同様のエラーが発生しました。具体的には、ユーロ記号 (€) を使用します。

x = "€".encode()

エラーが発生しました:

UnicodeDecodeError: 'ascii' コーデックは位置 0 のバイト 0xe2 をデコードできません: 序数が範囲外です (128)

私がそれを解決した方法は次のとおりです。

x = "€".decode()

これが役立つことを願っています!

于 2014-11-30T20:49:28.253 に答える