Python3中Unicode与Bytes的核心区别及转换详解

Miles
Miles
发布时间:2026-10-13 | 4人浏览过
原创

本文深入解析Python3中str(Unicode)与bytes类型的核心差异。详细阐述两者在I/O操作中的角色,演示显式编码与解码的正确方法,并通过文件读写示例说明如何避免编码错误。掌握“内部Unicode、外部Bytes”原则,提升Python编程中的数据处理准确性。

Python3中Bytes类型的引入与背景

近期在Python3的开发实践中,频繁接触到bytes类型。这一类型在Python2中并不存在,构成了Python3与Python2之间最显著的差异之一。

在Python2时代,编写代码时经常遭遇编码相关的异常报错,这主要归因于Python2对Unicode的支持尚不完善。而在Python3中,所有源代码默认均被视为Unicode字符串。Python解释器在运行时会自动将数据(除非显式定义为bytes类型)转换为Unicode格式,从而有效降低了编码错误的概率。

str与bytes类型的核心区别

Python3提供了两种字符串类型:默认的是str,即Unicode,通常被称为文本类型;另一种是bytes,用于处理I/O操作(如磁盘读写、网络传输)中的二进制数据。bytes类型本质上是一个字节序列,其中每个元素是0到256之间的整数。

Bytes类型的定义方法

定义bytes类型主要有两种显式方式,示例如下:


#只能允许ASCII值
x=b'abc'
y=b'\xe6\x88\x91'
print (x,y)
#对unicode字符集进行特定编码
t=bytes("我们","UTF-8")
#输出b'\xe6\x88\x91\xe4\xbb\xac'
#一个中文字符,UTF-8编码占用三个字节
print (t)
#返回6,对于python来说,就是字节序列的长度
print (len(t))
#返回2,代表两个字符
print (len("我们"))

str与bytes的显式转换机制

接下来讨论str与bytes之间的转换机制。当从网络读取二进制数据后,Python要求开发者显式将其转换为str类型。这意味着Python不会在str和bytes之间进行隐式转换,虽然这增加了操作的繁琐度,但能显著减少因自动转换导致的潜在错误,让开发者更清晰地掌控数据处理流程。

编码转换实战:Str转Bytes与Bytes转Str

若要将str转换为bytes,必须指定编码方式,以明确二进制数据的编码规则,例如:


x="我"
y=x.encode("UTF-8")
z=x.encode("GBK")
#b'\xe6\x88\x91' b'\xce\xd2'
print (y,z)

反之,将bytes转换为str同样需要指定编码。关键在于必须知晓二进制数据的具体编码格式,若选择错误的编码,转换至Unicode时将会出错。此外,Python内部并不关心bytes数据的原始编码,只要它是bytes类型,就被视为一串字节序列,例如:


x=b'\xe6\x88\x91'
print (x.decode("UTF-8"))
#会报错
print (x.decode("GBK"))

Python内部Unicode与外部Bytes的原则

简而言之,Python遵循“内部使用Unicode,外部使用Bytes”的原则。Python内置库中的许多函数会明确指定需要str类型还是bytes类型(严格来说包括bytes-like对象,如bytes、bytearray等)。编写代码时需仔细核对,例如hmac库的new方法要求:


hmac.new(key, msg=None, digestmod=None) key is a bytes or bytearray object giving the secret key

许多库,尤其是第三方库(如requests),为了兼容Python2和Python3,会在内部执行大量的转换工作,使得开发者可能意识不到bytes类型的存在。虽然这提高了开发效率,但对于深入理解Python的底层机制并无太大助益。

文件读写中的编码处理示例

若要透彻理解bytes和str的应用场景,建议参考open和write这两个内置函数的实现细节。

以文本模式打开文件时,Python会在内部自动将数据转换为str类型,例如:


file ="t.txt"
t = open(file,mode="r").read()

若以二进制模式打开文件,并在终端显示内容,则需要将其转换为str类型,例如:


file ="t.txt"
t = open(file,mode="rb").read()
print (t.decode())
print (t,type(t))

若以二进制模式写入数据,则直接将bytes类型的数据写入文件,例如:


file="t.txt"
t=open(file,mode="wb")
t.write(b'\xe6\x88\x91')

在上述示例中,均未明确指定编码方式。若未显式指定,默认编码通常等同于locale.getpreferedencoding() 。

总结

以上是对Python3中Unicode与Bytes问题的详细介绍,希望能对大家有所帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢大家对本站的支持! 如果您觉得本文对您有帮助,欢迎转载,请注明出处,谢谢!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表