Python:UnicodeEncodeError:'ascii'编解码器无法对位置34-39中的字符进行编码:序数不在范围内(128)

时间:2014-07-08 23:28:57

标签: python unicode python-unicode

我已经获得了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()

P.S。我使用的是Python 2.7.5版本

2 个答案:

答案 0 :(得分:0)

正如您所发现的,基本问题是ASCII不能代表很多unicode。

所以你必须选择如何处理它:

  • 不显示非ASCII字符
  • 将非ASCII字符显示为其他类型的表示

第一选择是这样的:

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替换为replacexmlcharrefreplacebackslashreplace

此处the reference

答案 1 :(得分:0)

错误消息为您提供了两条线索:首先,问题出在语句

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())