Python编码错误:UnicodeEncodeError: 'ascii' codec can't encode 的一些总结

对于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

 

你可能感兴趣的:(Python)