【python UnicodeDecodeError pickle open】Python 2.x -> 3.x str前有u

本文介绍了在Python 2.x到3.x迁移过程中,由于字符编码问题导致的UnicodeDecodeError,特别是涉及pickle操作时的处理方法。在非pickle场景下,建议在写文件时使用UTF-8编码,并在3.x中指定编码读取。而在pickle场景下,错误地在open函数中指定encoding会导致错误,正确做法是在pickle函数内部指定编码。
摘要由CSDN通过智能技术生成

原因

python在2.x与3.x版本之间常常会因为字符编码的不融洽的问题出现UnicodeDecodeError这个问题。

str 前有u

利用str.encode进行解决

string = u'anomaly'
print(string.encode('utf-8')) 
# 'anomaly'

更具体的内容参考:https://blog.csdn.net/qq_21153619/article/details/84841184

情形一 非pickle场景下

在非pickle解码的场景下,open函数一般不会用bianry的方式去解码文件,这个时候可以在写这个文件的时候,利用python 2.x把encoding改为utf-8或者ISO-8859-1,建议在文件里写的时候,还是注意一下把str给encode一下再输出出去。

data # some data of str 
f = open(file_path, 'w', encoding='utf-8')
for item in data:
	f.write(item.encode('utf-8'))
f.close()

然后用python 3.x指定encoding去读。

情形二 pickle场景下

我们在存储pickle文件的时候,通常是用binary的方式去dump的,就像

data # some data of some kinds
pickle.dump(data, open(data_path, 'wb'))

这个时候如果我们按照上一步的方式这么去读会报错,提示在binary的前提下进行读取的时候,不能在open函数中指定encoding。
错误方式:

pickle.load(data, open(date_path, 'rb', encoding='utf-8'))  # 报错

正确方式:
在pickle函数的内部,而非open函数的内部指定encoding

pickle.load(data, open(data_path, 'rb'), encoding='latin1')

参考:https://blog.csdn.net/wangleiwavesharp/article/details/106402165

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值