对于Python处理文本数据的时候经常出现的就是编码错误了,烦不胜烦,编码出错时的错误提示为:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
处理的方式有如下,摸索的情况:
1,在文件的头部加上下面两行代码,记住代码之间不要换行
#!/usr/bin/env python
#coding=utf-8
2,引用的时候加上声明
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
3,如果是文件写入或打开使用codecs方法声明文件打开的类型:
import codecs
fw = codecs.open('test1.txt','a','utf-8')
fw.write(line2)
# 更快速的写法
test_docs = [x.strip().split() for x in codecs.open(test_docs, "r", "utf-8").readlines()]
4,走投无路,抱着试试看的态度,转码
将中文部分进行转码,这个前提是要知道该文本本身的编码格式。一般来说如果是window上的文件默认是用‘gbk’的,如果你按照上面1,2步将文件安装‘utf-8’解析,就会报错,因此先用decode将‘gbk’解码成‘Unicode’,然后再用encode将‘Unicode’转换成‘utf-8’,这样文件就能识别了,如下所示:
query = '中文字符'
query.decode('gbk').encode('utf-8')
难点是要知道文本以前的编码格式。
5,str()函数能不用就不用
原函数如下所示,就是想输出而已,但是就报编码的错误。
def parse_output(row):
search_id = row[0]
contentid_or_query = row[1]
click_num = row[2]
strm = str(search_id)+"\t"+str(contentid_or_query)+"\t"+str(click_num)
return strm
因为contentid_or_query本身是中文字符,如果用str()函数的话其实就是把它进行转码了,鬼知道str()函数是转成什么编码。所以就抱着试试看的态度把str()函数去掉,你猜怎么着,然后就不报错了:
def parse_output(row):
search_id = row[0]
contentid_or_query = row[1]
click_num = row[2]
#try:
strm = str(search_id)+"\t"+contentid_or_query+"\t"+str(click_num)
#except UnicodeEncodeError as e:
#return ""
return strm
有的时候已经是string类型了 但是你还用str的话也会报错,这个最好是做个判断不是string类型的才用str转:
new_row = []
for line in row:
if isinstance(line,int):
line = str(line)
new_row.append(line)
#new_row = [str(line) for line in row]
strm = "\t".join(new_row)
return strm