我已经获得了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版本
答案 0 :(得分:0)
正如您所发现的,基本问题是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
。
答案 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())