当我使用此代码时(改编自Stephen Holiday code - 谢谢,Stephen为您的代码!):
#!/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
没有这样的论点。
那么,如何解决这个问题,为非ASCII名称避免这个UnicodeDecodeError
?
我在GAE中使用此代码。
答案 0 :(得分:2)
看起来你的第一个追溯是与AppEngine相关的。您是否正在构建将填充数据存储区的加载程序?如果是这样,查看包含模型的代码并执行put
'会有所帮助。我可能会被某人纠正,但为了让这件作品能够发挥作用,我相信你实际上需要decode
而不是encode
(即当你在put
之前阅读表格时,根据您的具体情况,使用decode('utf-8')
或decode('latin1')
将字符串转换为unicode。
就本地代码而言,我不会假装知道Unicode处理的深层内部,但我通常使用decode()
和encode()
来处理这些类型的情况。我相信使用的正确编码取决于底层文本(意味着您需要知道它是否已编码utf-8
或latin-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
的情况下可能会很好用。
答案 1 :(得分:0)
除非我遗漏了某些东西,否则库中的这一行:
pbvalue.set_stringvalue(unicode(value).encode('utf-8'))
应该是:
pbvalue.set_stringvalue(value.decode(filename_encoding).encode('utf-8'))
如果没有以某种方式存储在zip存档中,从代码传入的值filename_encoding
(至少在格式的早期版本中,我怀疑它是否存储)。这是假设字节和“字符”是同一个东西的另一个经典错误。
如果你感到沮丧,请深入研究代码并修复它,甚至可能会提供补丁。否则,您将必须编写英雄代码,在文件名中检查U + 0080及以上版本并执行特殊处理。
答案 2 :(得分:0)
在python 2.7(和Linux Mint 17.1)中,你必须使用: 主题标签= [ 'transito', 'tránsito', '南渡江', 'PINGUINO', 'fhürer'] 对于h in hashtags: U = h.decode( 'UTF-8') 打印(u.encode( 'UTF-8'))
transito tránsito 南都 PINGUINO fhürer