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

本文深入探讨了Python处理文本数据时常见的编码错误,包括错误提示、原因分析及五种实用解决策略,如使用'iconv'命令、代码声明、codecs模块、转码技巧和避免str()函数不当使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于Python处理文本数据的时候经常出现的就是编码错误了,烦不胜烦,编码出错时的错误提示为:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

处理的方式有如下,摸索的情况:

0,使用'iconv'命令将文件转换成utf-8格式

iconv -f gb18030 -t utf-8 Search—Report2019-11-18.csv > search_search.csv

 

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一杯拿铁go

你的打赏是我更新最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值