当你在Python中处理文本文件、网络数据传输或读取二进制文件时,总会绕不开两个看似相似却截然不同的类型——str和bytes。它们一个承载着人类可理解的字符,一个对应着计算机能直接识别的二进制数据,看似只是形式差异,实则是编程中处理“字符编码”问题的核心关键,理解它们的区别,能帮你避开80%的编码报错陷阱。
str(字符串)是Python中表示文本的核心类型,它以Unicode编码为底层支撑,存储的是人类可阅读的字符(比如中文、英文、表情符号等),本质是“抽象的字符序列”,不直接对应具体的二进制数据。bytes(字节串)则是二进制数据的直接表示,由0-255的整数组成,以b前缀标识(如b'hello'),它是计算机存储和传输数据的原生形式,无法直接被人类阅读,必须通过编码/解码转换为字符。
举3个直观例子帮你理解:
message = "编程学习",此时message是str类型,存储的是Unicode字符;若你要把这段文字写入二进制文件,必须先转成bytes,否则会报错。bytes类型(比如b'<html>...</html>'),只有通过解码(指定编码如UTF-8)转成str,才能正常提取其中的文字内容。open('test.txt', 'r')读取文件时,返回的是str(自动解码);用open('test.txt', 'rb')读取时,返回的是bytes(原始二进制数据),若直接打印bytes类型,会看到b'xxx'的形式。你是否曾遇到过这样的情况:明明代码里写的是正常中文,运行后却出现UnicodeDecodeError?明明把str写入文件,却显示乱码?这本质上是没理清str和bytes的转换逻辑——计算机只认字节,而人类只认字符,编码就是“字符转字节”的规则,解码则是“字节转字符”的规则,一旦规则不匹配,乱码或报错就会发生。
转换的核心是指定编码格式(常用UTF-8、GBK等,推荐优先使用UTF-8):
str.encode(encoding='utf-8')方法 示例:# 字符串转字节串s = "Python编程"b = s.encode('utf-8') # 按UTF-8编码转换print(type(b)) # 输出:<class 'bytes'>print(b) # 输出:b'Python\xe7\xbc\x96\xe7\xa8\x8b'bytes.decode(encoding='utf-8')方法 示例:# 字节串转字符串b = b'Python\xe7\xbc\x96\xe7\xa8\x8b's = b.decode('utf-8') # 按UTF-8解码转换print(type(s)) # 输出:<class 'str'>print(s) # 输出:Python编程⚠️ 注意:解码时的编码格式必须和编码时一致,比如用GBK编码的bytes,必须用GBK解码,否则会抛出UnicodeDecodeError。
str是Unicode字符序列(面向人类),bytes是二进制字节序列(面向计算机);str无固定存储大小(不同字符占不同Unicode码点),bytes每个元素是0-255的整数,占用1字节。str转bytes靠编码(encode),bytes转str靠解码(decode),核心是指定统一的编码格式(如UTF-8)。str需转成bytes才能进行文件写入、网络传输等底层操作;bytes需转成str才能被人类阅读和处理,编码格式不匹配是乱码/报错的核心原因。全文通过场景化例子和实操代码,拆解了str与bytes的本质差异,明确了转换方法,也解释了日常编程中编码问题的根源——理解“字符-字节-编码”的关系,是处理Python文本数据的关键,而掌握encode和decode方法,就能灵活应对绝大多数文本与二进制数据的转换场景。
长按或扫描下方二维码,免费获取 Python公开课和大佬打包整理的几百G的学习资料,内容包含但不限于Python电子书、教程、项目接单、源码等等 推荐阅读
点击 阅读原文 了解更多