0

0

Python 字符串与 bytes 的区别与转换

冰川箭仙

冰川箭仙

发布时间:2026-02-11 21:12:10

|

584人浏览过

|

来源于php中文网

原创

Python 3 严格区分 str(文本)和 bytes(二进制),二者类型、内存表示及操作接口均不同,混用导致 TypeError 或 UnicodeDecodeError;必须用 .encode() 和 .decode() 显式转换,且编码名需准确匹配。

python 字符串与 bytes 的区别与转换

bytes 和 str 在 Python 里不是能自动互转的“同一种东西”

Python 3 强制区分文本(str)和二进制数据(bytes),它们类型不同、内存表示不同、操作接口也不同。试图直接拼接、比较或传参时出错,比如 TypeError: can't concat bytes to strUnicodeDecodeError,根本原因就是混用了这两类对象。

关键判断:只要涉及文件读写、网络传输、编码处理、加密哈希等场景,就必须明确当前变量是 str 还是 bytes,不能靠“看起来像字符串”来猜测。

什么时候必须用 .encode() 和 .decode()

.encode()str 变成 bytes.decode()bytes 变回 str。这不是可选项,是类型转换的唯一合法方式。漏掉、反向调用、或编码名不匹配,都会立刻报错。

  • 读文件时用 open(..., 'r', encoding='utf-8') → 返回 str;用 open(..., 'rb') → 返回 bytes,此时不能直接 .split('\n'),得先 .decode('utf-8')
  • HTTP 响应体(如 requests.get(...).content)是 bytes,要转文本必须显式 .decode('utf-8')(注意:不是所有响应都声明了编码,别硬写 response.text 就以为安全)
  • subprocess.run(..., stdout=subprocess.PIPE)stdoutbytes,打印前要么 decode,要么用 text=True 参数让 subprocess 自动处理
  • 错误信息里出现 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0,说明你拿 utf-8 去解码一个其实是 gbk 或带 BOM 的 bytes,得换编码重试

常见坑:encode/decode 的参数不是摆设

编码名写错、省略、或依赖默认值,是隐形雷区。Python 默认编码是 utf-8,但很多老系统、Windows 文件、Excel 导出 CSV 默认用 gbkcp1252。不指定或写错,程序可能在一台机器跑通,换一台就崩。

Perl学习手札 chm版
Perl学习手札 chm版

Perl学习手札是台湾perl高手写的一篇文章,特打包为chm版,方便大家阅读。 关于本书 1. 关于Perl 1.1 Perl的历史 1.2 Perl的概念 1.3 特色 1.4 使用Perl的环境 1.5 开始使用 Perl 1.6 你的第一个Perl程序 2. 标量变量(Scalar) 2.1 关于标量 2.1.1 数值 2.1.2 字符串 2.1.3 数字与字符串转换 2.2 使用你自己的变量 2.3 赋值 2.3.1 直接设定 2.3.2 还可以这样 2.4 运算 2.5 变量的输出/输入 2.

下载

立即学习Python免费学习笔记(深入)”;

  • '中文'.encode() 等价于 '中文'.encode('utf-8'),没问题;但 b'\xc4\xe3'.decode() 会按 utf-8 解,实际是 gbk 编码,就报错
  • open(..., 'w')str 时,encoding 不写等于用系统默认,Linux 是 utf-8,Windows 控制台可能是 cp936,结果文件在别处打不开
  • 网络协议(如 HTTP header、JSON RPC)通常要求 ASCII-only 的 bytes,传中文 str 过去会直接失败,得先 encode 成 utf-8 再构造成 header 字段

len()、切片、in 操作的行为差异

strbytes 同样写 len(s)s[0:3],结果完全不同:前者按 Unicode 字符数算,后者按字节数算。这个差异在截断、分块、协议解析时极易出错。

  • len('€') 是 1(一个字符),len('€'.encode('utf-8')) 是 3(UTF-8 下欧元符号占 3 字节)
  • b'abc\xff'[0:2] 返回 b'ab''café'[0:2] 返回 'ca';但 'café'.encode()[0:2]b'ca',而 'café'.encode()[0:3]b'caf' —— 因为 é 在 UTF-8 中是 2 字节,开头 3 字节刚好卡在中间,decode 会失败
  • b'hello' in b'hello world' 是 True;'hello' in b'hello world' 是 False(类型不匹配,直接报错)

真正麻烦的是那些“看起来能过,其实逻辑错”的地方:比如按字节长度切日志行、用 bytes.find() 找 ASCII 关键字、却忘了输入可能是带 emoji 的 str —— 这类问题不会立刻报错,但数据会被截断或错位。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

436

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

317

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

488

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

214

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1547

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

640

2023.11.24

2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

68

2026.02.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.2万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号