0

このエラーコードがわかりません。誰でも私を助けることができますか?

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 2: 
ordinal not in range(128)

これはコードです:

import urllib2, os, zipfile
from lxml import etree

def xmlSplitter(data,separator=lambda x: x.startswith('<?xml')):
  buff = []
  for line in data:
    if separator(line):
      if buff:
        yield ''.join(buff)
        buff[:] = []
    buff.append(line)
  yield ''.join(buff)

def first(seq,default=None):
  """Return the first item from sequence, seq or the default(None) value"""
  for item in seq:
    return item
  return default

datasrc = "http://commondatastorage.googleapis.com/patents/grantbib/2011/ipgb20110104_wk01.zip"
filename = datasrc.split('/')[-1]

if not os.path.exists(filename):
  with open(filename,'wb') as file_write:
    r = urllib2.urlopen(datasrc)
    file_write.write(r.read())

zf = zipfile.ZipFile(filename)
xml_file = first([ x for x in zf.namelist() if x.endswith('.xml')])
assert xml_file is not None

count = 0
for item in xmlSplitter(zf.open(xml_file)):
  count += 1
  if count > 10: break
  doc = etree.XML(item)
  docID = first(doc.xpath('//publication-reference/document-id/doc-number/text()'))
  title = first(doc.xpath('//invention-title/text()'))
  lastName = first(doc.xpath('//addressbook/last-name/text()'))
  firstName = first(doc.xpath('//addressbook/first-name/text()'))
  street = first(doc.xpath('//addressbook/address/street/text()'))
  city = first(doc.xpath('//addressbook/address/city/text()'))
  state = first(doc.xpath('//addressbook/address/state/text()'))
  postcode = first(doc.xpath('//addressbook/address/postcode/text()'))
  country = first(doc.xpath('//addressbook/address/country/text()'))
  print "DocID:    {0}\nTitle:    {1}\nLast Name: {2}\nFirst Name: {3}\nStreet: {4}\ncity: {5}\nstate: {6}\npostcode: {7}\ncountry: {8}\n".format(docID,title,lastName,firstName,street,city,state,postcode,country)

私はインターネットのどこかでコードを取得し、番地、都市、州、郵便番号、および国を追加するコードを少しだけ変更しました。

XML ファイルには約 200 万行のコードが含まれていますが、それが理由だと思いますか?

4

3 に答える 3

3

プレーンテキストなどというものはありません。テキストには常にエンコーディングがあります。これは、特定の記号 (文字、コンマ、日本語の漢字) を一連のバイトで表現する方法です。シンボル「コード」からバイトへのマッピングは、エンコーディングと呼ばれます。

Python 2.7 では、エンコードされたテキスト (str) と一般的なエンコードされていないテキスト (unicode()) の違いは、せいぜい紛らわしいものです。Python 3 はすべてを捨て、デフォルトで常に unicode 型を使用します。

いずれにせよ、そこで起こっていることは、テキストを読み取って文字列に入れようとしているということですが、このテキストには ASCII エンコーディングに強制できない何かが含まれています。ASCII は、文字の標準セット (プログラミングに使用する文字、数字、記号) である 0 ~ 127 の範囲の文字のみを認識します。ASCII の可能な拡張の 1 つは latin-1 (iso-8859-1 とも呼ばれます) で、128 ~ 255 の範囲がアクセント付きの a などのラテン文字にマップされます。このエンコーディングには、1 バイト == 1 文字を取得できるという利点があります。UTF-8 は ASCII のもう 1 つの拡張であり、1 バイト == 1 文字という制約を解放し、一部の文字を 1 バイトで、一部の文字を 2 バイトなどで表現できるようにします。

問題を解決するには、状況によって異なります。どこで問題が発生するかによって異なります。おそらく、知らないエンコーディングでエンコードされたテキスト ファイルを解析していると思います。これは、latin-1 または UTF-8 のいずれかである可能性があります。その場合、open() で encoding='utf-8' を指定してファイルを開く必要がありますが、状況によって異なります。あなたが提供するものから言うのは難しいです。

于 2013-04-07T10:03:13.240 に答える
1

ASCII 文字の範囲は 0 (\x00) から 127 (\x7F) です。あなたの文字 (\xE4=228) は、可能な最大値よりも大きくなっています。したがって、この値をエンコードできるようにするには、コーデックを (たとえば UTF-8 に) 変更する必要があります。

于 2013-04-07T09:51:18.560 に答える