繁体   English   中英

Python:UnicodeEncodeError:'ascii'编解码器无法在位置34-39处编码字符:序数不在范围内(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。

因此,您必须选择如何处理它:

  • 不显示非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的东西,如replacexmlcharrefreplace ,或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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM