1

私がこのコードを使用するとき(スティーブンホリデーコードから適応 -あなたのコードをありがとう、スティーブン!):

#!/usr/bin/env python    
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-

"""
USSSALoader.py
"""
import os
import re
#import urllib2
from zipfile import ZipFile
import csv
import pickle

def getNameList():
    namesDict=extractNamesDict()
    maleNames=list()
    femaleNames=list()
    for name in namesDict:
        counts=namesDict[name]
        tuple=(name,counts[0],counts[1])
        if counts[0]>counts[1]:
            maleNames.append(tuple)
        elif counts[1]>counts[0]:
            femaleNames.append(tuple)
    names=(maleNames,femaleNames)
    return names

def extractNamesDict():
    zf=ZipFile('names.zip', 'r')
    filenames=zf.namelist()

    names=dict()
    genderMap={'M':0,'F':1}

    for filename in filenames:
        file=zf.open(filename,'r')
        rows=csv.reader(file, delimiter=',')

        for row in rows:
            name=row[0].upper()
           # name=row[0].upper().encode('utf-8')
            gender=genderMap[row[1]]
            count=int(row[2])

            if not names.has_key(name):
                names[name]=[0,0]
            names[name][gender]=names[name][gender]+count

        file.close()
        print '\tImported %s'%filename
    return names

if __name__ == "__main__":
    getNameList()

このエラーが発生しました:

  iterator = raw_query.Run(**kwargs)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\datastore.py", line 1622, in Run
    itr = Iterator(self.GetBatcher(config=config))
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\datastore.py", line 1601, in GetBatcher
    return self.GetQuery().run(_GetConnection(), query_options)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\datastore.py", line 1490, in GetQuery
    filter_predicate=self.GetFilterPredicate(),
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\datastore.py", line 1534, in GetFilterPredicate
    property_filters.append(datastore_query.make_filter(name, op, values))
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\datastore\datastore_query.py", line 107, in make_filter
    properties = datastore_types.ToPropertyPb(name, values)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\datastore_types.py", line 1745, in ToPropertyPb
    pbvalue = pack_prop(name, v, pb.mutable_value())
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\datastore_types.py", line 1556, in PackString
    pbvalue.set_stringvalue(unicode(value).encode('utf-8'))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe1 in position 1: ordinal not in range(128)

これは、ASCII以外の文字(「Chávez」や「Barañao」など)を使用した名前がある場合に発生します。私はこれを行ってこの問題を修正しようとしました:

     for row in rows:
           # name=row[0].upper()
            name=row[0].upper().encode('utf-8')
            gender=genderMap[row[1]]
            count=int(row[2])

しかし、その後、私はこの他のエラーを受け取りました:

 File "C:\Users\CG\Desktop\Google Drive\Sci&Tech\projects\naivebayes\USSSALoader.py", line 17, in getNameList
    namesDict=extractNamesDict()
  File "C:\Users\CG\Desktop\Google Drive\Sci&Tech\projects\naivebayes\USSSALoader.py", line 43, in extractNamesDict
    name=row[0].upper().encode('utf-8')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xed in position 3: ordinal not in range(128)

私もこれを試しました:

def extractNamesDict():
    zf=ZipFile('names.zip', 'r', encode='utf-8')
    filenames=zf.namelist()

しかし、ZipFileそのような議論はありません。

それで、UnicodeDecodeError非ASCII名でこれを回避する方法を修正するにはどうすればよいですか?

私はこのコードをGAEで使用しています。

4

3 に答える 3

2

最初のトレースバックはAppEngineに関連しているようです。データストアにデータを入力するローダーを構築していますか?もしそうなら、モデルを構成し、'ingを実行するコードを見るputと役に立ちます。私はおそらく誰かによって修正されるでしょうが、その部分が機能するためには、decode代わりに実際に修正する必要があると思いますencode(つまり、の前にシートを読んだときに、状況に応じて、またはputを使用して文字列をユニコードに変換します)。decode('utf-8')decode('latin1')

あなたのローカルコードに関しては、私はUnicode処理の深い内部を知っているふりをしませんが、私は一般的にこれらのタイプの状況を使用decode()して処理しました。encode()使用する正しいエンコードは、基になるテキストによって異なると思います(つまり、エンコードされているかどうかなどを知る必要がありますutf-8latin-1。これがあなたの例での簡単なテストです:

>>> s = 'Chávez'
>>> type(s)
<type 'str'>
>>> u = s.decode('latin1')
>>> type(u)
<type 'unicode'>
>>> e = u.encode('latin1')
>>> print e
Chávez

この場合、latin1エンコードされた文字列をデコードするためにを使用する必要がありました(私は端末を使用していました)が、あなたの状況では、を使用utf-8すると非常にうまくいく可能性があります。

于 2012-08-17T01:37:49.940 に答える
0

何かが足りない場合を除いて、ライブラリのこの行は次のとおりです。

pbvalue.set_stringvalue(unicode(value).encode('utf-8'))

する必要があります:

pbvalue.set_stringvalue(value.decode(filename_encoding).encode('utf-8'))

そして、filename_encoding何らかの形でzipアーカイブに保存されていない場合、コードから渡された値(少なくとも初期バージョンの形式では、保存されているとは思えません)。これは、バイトと「文字」が同じものであると想定するという古典的なエラーのさらに別の発生です。

カエルを感じている場合は、コードに飛び込んで修正し、パッチを提供することもできます。それ以外の場合は、ファイル名にU + 0080以上をチェックし、特別な処理を実行する英雄的なコードを作成する必要があります。

于 2012-08-17T03:25:37.933 に答える
0

Python 2.7(およびLinux Mint 17.1)では、ハッシュタグのhに次を使用する必要があります:hashtags = ['transito'、'tránsito'、'ñandú'、'pingüino'、'fhürer']:u = h.decode('utf -8')print(u.encode(' utf-8'))

Transitotránsitoñandúpingüinofhürer

于 2015-01-31T08:43:20.820 に答える