0

書いているスクリプトのUnicodeに問題があります。私はこのサイトを含めてインターネットを精査し、多くのことを試みましたが、何が悪いのかまだわかりません。

私のコードは非常に長いですが、その抜粋を示します。

raw_results = get_raw(args)
write_raw(raw_results)
parsed_results = parse_raw(raw_results)
write_parsed(parsed_results)

基本的に、UTF-8でエンコードされたXML形式の生の結果が得られます。RAWデータの書き込みに問題はありません。しかし、解析されたデータの書き込みはそうです。したがって、問題はデータを解析する関数の内部にあると確信しています。

私はすべてを試しましたが、問題が何であるかわかりません。この単純な行でさえ、私にエラーを与えます:

def parse_raw(raw_results)
    content = raw_results.replace(u'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>', u'')

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

理想的には、Unicodeで作業でき、問題がないことを望んでいますが、Unicodeを置き換えたり無視したり、通常のテキストのみを使用したりしても問題はありません。完全なコードを提供していないことは知っていますが、仕事に関連しているため、問題があることを理解しています。しかし、これで私に助けが得られることを願っています。

編集:私のparse_raw関数の上部:

from xml.etree.ElementTree import XML, fromstring, tostring
def parse_raw(raw_results)    
    raw_results = raw_results.decode("utf-8")
    content = raw_results.replace('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>', '')
    content = "<root>\n%s\n</root>" % content
    mxml = fromstring(content)

Edit2 ::特殊文字がない限り、コードは正常に機能することを指摘するのは良い考えだと思います。100%英語であれば、問題ありません。外国文字やアクセント付き文字が含まれる場合は常に、問題が発生したときです。

4

2 に答える 2

3

raw_resultsおそらくstrオブジェクトであり、オブジェクトではありませんunicode

raw_results.replace(u'...', ...)Pythonが最初にをにデコードstr raw_resultsunicodeます。Python2はasciiデフォルトでコーデックを使用します。位置570にraw_resultsバイトが含まれていますが、これはコーデックでデコードできません(つまり、ASCII文字ではありません)。'\xd7'ascii

このエラーがどのように発生するかを示します。

In [27]: '\xd7'.replace(u'a',u'b')      
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 in position 0: ordinal not in range(128)

raw_results一方、 Unicodeの場合、を使用したサイレントデコードは行われないasciiため、エラーは発生しません。

In [28]: u'\xd7'.replace(u'a',u'b')
Out[28]: u'\xd7'

raw_results適切なコーデックを知っている場合は、明示的にデコードすることでこの問題を修正できます。

raw_results = raw_results.decode('latin-1')

latin-1単なる推測です。位置570の文字が乗算記号である場合は正しい可能性があります。

In [26]: print('\xd7'.decode('latin-1'))
×
于 2012-08-26T08:55:57.440 に答える
0

皆様からのご意見、ご感想をありがとうございました。その後、歯の細かい櫛でコードを何百万回も調べて自分の問題を解決しましたが、原因を見つけました。そして、私は今、すべての問題を解決しました。

同様の問題を抱えている人のために、私はあなたを助けることができる次の情報を持っています:

  • モジュールを使用しcodecsてファイルを書き込みます。
  • コード全体でそれを処理しようとしないでください。コードはメソッド全体で任意のタイプの文字セットを無視する必要があり、特定のメソッドまたは文字セットを変更するだけのメソッドの呼び出しが必要です。(これは私が問題を見つけるのに役立ちました)

私の問題は、ある時点でユニコードをユニコードに変換しようとしていたことでした。そして別の場所で、私は通常のASCIIを再びASCIIに変換しようとしていました。したがって、ある問題を解決するたびに別の問題が発生し、それが同じ問題であると考えました。

問題をセクションに分割します...そうすれば、問題が見つかる可能性があります。

于 2012-08-26T12:35:59.777 に答える