百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

彻底教你解决python中编码问题

off999 2024-11-25 15:56 44 浏览 0 评论

我们在使用python开发的过程中,编码问题是很常见,但是又很头疼问题。尤其以python2最为严重,虽然在python3中有所修改,但仍然是很多 Python 开发者的噩梦,无论你是工作多年的Python开发者,还是初学python的开发者。而碰到这种问题,我们经常是花费大力气,Google、百度、论坛、博客,非常欣慰的解决了问题,但是在下一次再遇到同样的问题,又要重复以上过程。下面我就总结一下python的编码问题,一定要收藏哦

Python 3 中 str 与 bytes

在 Python3中,字符串有两种类型 ,str和bytes。

  • unicode string(str 类型):以 Unicode code points 形式存储,人类认识的形式
  • byte string(bytes 类型):以 byte 形式存储,机器认识的形式

在 Python 3 中你定义的所有字符串,都是 unicode string类型,使用 type 和 isinstance 可以判别

# python3
>>> str_obj = "你好"
>>> type(str_obj)
<class 'str'>
>>> isinstance("你好", str)
True
>>> isinstance("你好", bytes)
False

bytes是一个二进制序列对象,只要在定义字符串时前面加一个b,就表示bytes类型的字符串对象。

# python3
>>> byte_obj = b"Hello World!"
>>> type(byte_obj)
<class 'bytes'>
>>> isinstance(byte_obj, str)
False
>>> isinstance(byte_obj, bytes)
True

但是在定义中文字符串时,如果直接加上b,就会报错,应该使用encode转码一下。

>>> byte_obj=b"你好"
  File "<stdin>", line 1
SyntaxError: bytes can only contain ASCII literal characters.
>>> str_obj="你好"
>>> str_obj.encode("utf-8")
b'\xe4\xbd\xa0\xe5\xa5\xbd'

Python 2 中 str 与 unicode

在Python2里,字符串也只有两种类型,unicode和str。

只有 unicode object 和非unicode object其实应该叫 str object)的区别:

  • unicode string(unicode类型):以Unicode code points形式存储,人类认识的形式
  • byte string(str 类型):以byte形式存储,机器认识的形式

当我们直接使用双引号或单引号包含字符的方式来定义字符串时,就是 str 字符串对象

# python2
>>> str_obj="你好"
>>> type(str_obj)
<type 'str'>
>>> isinstance(str_obj, bytes)
True
>>> isinstance(str_obj, str)
True

而当我们在双引号或单引号前面加个u,就表明我们定义的是 unicode 字符串对象

# python2
>>> unicode_obj = u"你好"
>>> type(unicode_obj)
<type 'unicode'>
>>> isinstance(unicode_obj, bytes)
False
>>> isinstance(unicode_obj, str)
False

如何检测对象的编码

所有的字符,在 unicode 字符集中都有对应的编码值(英文叫做:code point)

把这些编码值按照一定的规则保存成二进制字节码,就是我们说的编码方式,常见的有:UTF-8,GB2312 等。

也就是说,当我们要将内存中的字符串持久化到硬盘中的时候,都要指定编码方法,而反过来,读取的时候,也要指定正确的编码方法(这个过程叫解码),不然会出现乱码。

那问题就来了,当我们知道了其对应的编码方法,我们就可以正常解码,但并不是所有时候我们都能知道应该用什么编码方式去解码?

这时候就要用到python的库--chardet ,需要单独安装

python3 -m pip install chardet

chardet有一个detect方法,可以预测其编码格式

>>> import chardet
>>> chardet.detect('今天天气很不错'.encode('gbk'))
{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}

为什么说是预测呢,通过上面的输出来看,我们看到有一个confidence字段,表示预测的可信度。

既然是预测,那么如果样本数越多,当然预测就越接近真实值,若你的字符数较少,就有可能出现预测失误,举例如下:比如只有 中文 两个字,就像下面这样,我们是 使用 gbk 编码的,使用 chardet 却识别成 KOI8-R 编码。

>>> str_obj = "中文"
>>> byte_obj = bytes(a, encoding='gbk')  # 先得到一个 gbk 编码的 bytes
>>> chardet.detect(byte_obj)
{'encoding': 'KOI8-R', 'confidence': 0.682639754276994, 'language': 'Russian'}
>>> str_obj2 = str(byte_obj, encoding='KOI8-R')
>>> str_obj2
'жпнд'

中文字符,而且我们使用的gbk进行编码,但是预测出来却是俄语,KOI8-R编码。所以为了编码诊断的准确,要尽量使用足够多的字符。

chardet 支持多国的语言,从官方文档中可以看到支持如下这些语言(https://chardet.readthedocs.io/en/latest/supported-encodings.html)

编码与解码的区别

编码和解码,其实就是str与bytes的相互转化的过程,我们这里只说python3的

  • 编码:encode方法,把字符串对象转化为二进制字节序列
  • 解码:decode方法,把二进制字节序列转化为字符串对象

如果我们知道一串字符串的编码格式,如何来转成unicode呢?

有两种方法

第一种是,直接使用 decode 方法

>>> byte_obj.decode('gbk')
'中文'

第二种是,使用 str 类来转

>>> str_obj = str(byte_obj, encoding='gbk')
>>> str_obj
'中文'

如何设置文件编码

在Python 2中,默认使用的是 ASCII 编码来读取的,因此,我们在使用Python 2的时候,如果你的python文件里有中文,运行是会报错的。

SyntaxError: Non-ASCII character '\xe4' in file demo.py

原因就是 ASCII 编码表太小,无法解释中文。

而在 Python 3 中,默认使用的是 uft-8 来读取,所以省了不少的事。

对于这个问题,通常解决方法有两种:

第一种方法

在 python2 中,可以在文件头部指定编译器读取源码时采取的编码和解码方式

# -*- coding: utf-8 -*- 
# coding:utf-8
# coding=utf-8 

以上三种书写方式,任选一种即可

第二种方法

import sys 

reload(sys) 
sys.setdefaultencoding('utf-8') 

这里在调用sys.setdefaultencoding(‘utf-8’) 设置默认的解码方式之前,执行了reload(sys),这是必须的,因为python在加载完sys之后,会删除 sys.setdefaultencoding 这个方法,我们需要重新载入sys,才能调用 sys.setdefaultencoding 这个方法。

总结

除了以上介绍的编码和解码问题,实际使用当中还有很多编解码相关的情况,比如控制台中输出结果和实际文件中输出结果不一样,这就是因为默认的编码方式不同造成的。这种问题在调试的时候是最常见的。限于篇幅问题,后面我们有时间再进行详细的解释,可能需要出一个视频。今天就先到这里。

相关推荐

u盘最便宜多少钱一个(u盘最低价格)

一般情况下,一分钱,一分货;没有又便宜,货又好的事情。1、扩容盘。扩容盘是用PC技术,在量产时运用容量优先,输入了固定的容量,但它真实的容量只有标称容量的10倍左右。512M没人要的U盘扩容成4G,它...

小白三步装机教程(小白三步装机法)

下面给大家整理了一份小白装机的详细教程,有需要的朋友们快来看看吧!1、我们下载一个小白软件,然后选择了安装win7系统。2、在下载界面,下载速度取决于您的网络您只需要耐心等待即可。3、软件下载完成后会...

winpe下载官网下载iso(winpe.iso下载)

你好,以winpe装win7iso系统说明安装步骤:  1、根据教程制作好winpe启动盘,然后将下载的win7iso系统文件直接复制到U盘的GHO目录下;  2、在需要装系统的电脑上...

把系统装在u盘(把系统装在u盘里的缺点)

系统装进U盘有效的方法。1、下载并且安装好大白菜装机版,打开安装好的大白菜装机版,插入u盘等待软件成功读取到u盘之后,点击“一键制作启动u盘”进入下一步操作:2、弹出的信息提示窗口中,选择自己下载的的...

恢复出厂设置对电脑有影响吗

电脑恢复出厂设置,对系统没有影响,原因如下:1、系统还原是电脑在使用中的一种正常运作,不还原电脑无法正常运行,系统还原是对电脑的维护,不会对电脑或系统造成损害。2、系统还原是一次大容量的数据读写、清除...

注册邮箱163免费登录入口官网

注册网易邮箱账号步骤如下:1、在浏览器的地址栏输入http://email.163.com/进入网易邮箱的登录页面,点击页面下方的立即注册2、点击立即注册进入邮箱的注册页面,点击页面上面的注册字母邮箱...

产品密钥win10专业版激活密钥免费

1不存在永久激活密钥,但可以使用一些有效期长的密钥去激活Win10专业版。2Windows10的激活方式是基于数字权利,当你购买Windows10时,系统会将您电脑的硬件信息和购买记录绑定在一起...

ghostxp系统下载怎么安装教程

系统之家下载的XP系统通常是一个ISO镜像文件,安装这个系统需要通过一些步骤来制作可启动安装介质并进行系统安装。以下是安装的基本步骤:准备安装介质:使用工具如Rufus或AnyBurn将下载的ISO文...

无线网桥监控安装方法(无线网桥怎么连接监控)

网桥连接无线路由器安装的设置方法如下1.主路由器上网正常,副路由器LAN口插一根网线,另一头连接电脑。主副路由器不需要用网线连接。2.电脑开机输入副路由器背面的设置地址,进入登录界面输入背面的账号密码...

怎么对电脑文件夹加密(怎么对电脑文件夹加密码)

1.右键点要加密的文件或文件夹,然后单击“属性”;2.在“常规”选项卡,点击“高级”。选中“加密内容以便保护数据”复选框;3.在加密文件夹时,系统将询问是否要同时加密它的子文件夹。要如果选择是,那它的...

windows系统下载手机(win10下载手机)

OPPO手机重新下载安装系统:先备份好重要数据!然后手机连接电脑把下载的固件存入手机。然后再长按电源键十秒钟进入关机状态(可拆卸电板的需取下电板然后重新安装)。再同时按住电源键跟音量减键,进入reco...

电脑系统分区怎么分(电脑系统分区怎么分区)

分区是将硬盘分割成不同的逻辑部分,每个分区可以被视为一个独立的存储设备。通过分区,可以更好地管理数据和操作系统。要进行电脑分区,可以按照以下步骤进行:1.确定分区方案:首先需要确定分区的目的和需求。...

电脑显卡怎么选择(电脑显卡怎样选择)

以下是一些通用的方法:1.在硬件层面进行配置:首先需要确认您的主板和操作系统是否支持多GPU并行,以及您的电源是否提供足够的功率支持。在BIOS中启用多GPU选项,并安装正确的驱动程序。然后,通...

设置软件下载(设置软件下载入口)

iphone13app的下载设置1、首先,打开手机桌面的【设置】。2、在设置界面,点击【面容ID与密码】。3、这时设置了键盘锁的会要求你输入键盘锁密码进入。4、进入之后,找到【iTunesStore...

电脑麦克风插孔是哪个(电脑麦克风插那)

1.蓝色的为音频输入口。一般的电脑后面都有三个音频接口:蓝色是音频输入,绿色是音频输出,粉红色麦克风。  2.音频输入(蓝色),为外接光驱.随身听及其它音频输入设备,即可以把外部的设备声音传送至电脑...

取消回复欢迎 发表评论: