![](/img/trans.png)
[英]Python mmh3: UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-14: ordinal not in range(128)
[英]Python: UnicodeEncodeError: 'ascii' codec can't encode characters in position 34-39: ordinal not in range(128)
我有一个Twitter日志数据,我必须对文件进行排序以显示每个用户的转发推文排名。
这是代码。
import codecs
with codecs.open('hoge_qdata.tsv', 'r', 'utf-8') as tweets:
tweet_list = tweets.readlines()
tweet_list.pop(0)
facul={}
for t in tweet_list:
t = t.split('\t')
t[-2] = int(t[-2])
if t[-2] <= 0:
continue
if not t[0] in facul:
facul[t[0]] = []
facul[t[0]].append(t)
def cmp_retweet(a,b):
if a[-2] < b[-2]:
return 1
if a[-2] > b[-2]:
return -1
return 0
for f in sorted(facul.keys()):
facul[f].sort(cmp=cmp_retweet)
print ('[%s]' %(f))
for t in facul[f][:5]:
print ('%d:%s:%s' % (t[-2], t[2], t[-1].strip())
我不知何故出现了一个错误,说:
print '%d:%s:%s' %(t[-2], t[2], t[-1].strip())
UnicodeEncodeError: 'ascii' codec can't encode characters in position
34-39: ordinal not in range(128)
日语字母似乎无法解码。 我怎样才能解决这个问题? 我尝试使用sys.setdefaultencoding("utf-8")
但随后出现错误:
sys.setdefaultencoding("utf-8")
AttributeError: 'module' object has no attribute 'setdefaultencoding'
这是我尝试的方法:
import codecs
import sys
sys.setdefaultencoding("utf-8")
with codecs.open('hoge_qdata.tsv', 'r', 'utf-8') as tweets:
tweet_list = tweets.readlines()
ps我正在使用Python版本2.7.5
正如您所发现的,基本问题是ASCII不能代表很多unicode。
因此,您必须选择如何处理它:
首选是这样的:
for t in facul[f][:5]:
print ('%d:%s:%s' % (
t[-2],
t[2].encode('ascii', errors='ignore'),
t[-1].encode('ascii', errors='ignore').strip()
))
而第二个选择将取代ignore
的东西,如replace
, xmlcharrefreplace
,或backslashreplace
。
这是参考 。
该错误消息为您提供了两个线索:首先,问题出在语句中
print '%d:%s:%s' %(t[-2], t[2], t[-1].strip())
第二,问题与encode
操作有关。 如果您不记得“编码”的含义,那么现在将是重新阅读Python 2.7文档中的Unicode HOWTO的好时机。
列表t[]
似乎包含Unicode字符串。 print()
语句正在发出字节字符串。 Unicode字符串到字节字符串的转换是编码 。 由于您未指定编码,因此Python会隐式执行默认编码。 它使用无法处理任何带重音或非拉丁字符的ascii
编解码器。
尝试将print()
语句分为两部分。 首先,将unicode t[]
值插入unicode格式的字符串中。 请注意使用u''
语法。 其次,将unicode字符串编码为UTF并打印。
s = u'%d:%s:%s' %(t[-2], t[2], t[-1].strip())
print s.encode('utf8')
(我尚未对您的代码进行此更改的测试。请告知是否无效。)
我认为sys.setdefaultencoding()
可能是个红色鲱鱼,但我对您的环境不太了解。
顺便说一句,正如您在上面所写,该语句具有不平衡的括号。 粘贴代码时是否删除了右括号?
print ('%d:%s:%s' %(t[-2], t[2], t[-1].strip())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.