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

发布时间 - 2026-01-31 00:00:00    点击率:
Python 3 中 str 和 bytes 是互不兼容的类型,str 表示 Unicode 文本,bytes 表示原始字节;必须用 encode()/decode() 显式转换,且需指定编码(如 "utf-8"),文件读写、网络请求等 I/O 操作需严格匹配类型。

字符串是 Unicode

,字节串是 raw bytes

Python 3 中 strbytes 是两种完全不同的类型,不能直接拼接或比较。前者表示人类可读的文本(Unicode 码点序列),后者表示原始的 0/1 字节序列。常见错误如 "hello" + b"world" 会直接报 TypeError: can't concat str to bytes

关键判断依据:文件路径、网络请求体、加密输入等底层 I/O 操作几乎都要求 bytes;而用户输入、日志打印、JSON 解析结果等基本都是 str

encode() 和 decode() 是唯一安全转换方式

转换必须显式指定编码(encoding),最常用的是 "utf-8"。没有“默认自动识别”这回事——Python 不会猜你存的是 GBK 还是 UTF-8,猜错就出乱码。

  • "你好".encode("utf-8")b"\xe4\xbd\xa0\xe5\xa5\xbd"
  • b"\xe4\xbd\xa0\xe5\xa5\xbd".decode("utf-8")"你好"
  • 用错编码会触发 UnicodeDecodeErrorUnicodeEncodeError,比如用 "gbk" 去解一个 UTF-8 字节串
  • 某些场景下可用 errors="ignore"errors="replace" 避免崩溃,但会丢失或替换数据,慎用

读写文件时 encoding 参数决定返回类型

打开文件不用 encoding 参数(即默认二进制模式),read() 返回 bytes;显式指定 encoding(如 open("f.txt", "r", encoding="utf-8")),则返回 str。这个参数不只影响读,也影响写入行为。

  • 二进制模式:open("data.bin", "rb") → 必须用 bytes 写,read() 返回 bytes
  • 文本模式:open("text.txt", "w", encoding="utf-8") → 只能用 str 写,write("abc") 合法,write(b"abc") 报错
  • Windows 上不指定 encoding 且用文本模式,可能默认用 cp1252,导致中文直接乱码

网络和序列化场景下类型容易被忽略

HTTP 请求体、socket 发送、json.dumps() 输出、pickle 序列化结果……这些操作对输入类型的敏感度极高。例如 requests.post(url, data=b"raw") 发的是字节流,而 data="text" 会被自动编码为 UTF-8 字节再发;但如果你手动 .encode() 了又传给 data=,就可能被二次编码。

  • json.loads() 接收 strbytes,但后者必须是 UTF-8 编码,否则报错
  • subprocess.run(..., input=b"xxx") 要求 bytes,而 input="xxx" 会尝试用系统默认编码转,不可靠
  • bytes.fromhex("aabbcc")int.to_bytes() 构造字节串时,别误以为它能直接当字符串打印——它不是文本
实际处理中,最常出问题的地方不是不会转,而是忘了在哪一层已经转过一次,又在另一层重复 encode/decode。尤其在多层封装(如 requests → urllib3 → socket)中,类型边界容易模糊。


# python  # js  # json  # windows  # 编码  # 字节  # win  # 区别  # 封装  # 字符串  # int  # input  # http  # 的是  # 报错  # 都是  # 你好  # 如果你  # 序列化  # 两种  # 自动识别  # 这回  # 极高 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么为数据库表字段添加索引以优化查询  如何用PHP工具快速搭建高效网站?  如何快速搭建二级域名独立网站?  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  如何在景安云服务器上绑定域名并配置虚拟主机?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  公司网站制作需要多少钱,找人做公司网站需要多少钱?  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  如何自定义建站之星模板颜色并下载新样式?  高端网站建设与定制开发一站式解决方案 中企动力  使用C语言编写圣诞表白程序  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  Laravel用户密码怎么加密_Laravel Hash门面使用教程  网站优化排名时,需要考虑哪些问题呢?  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  高防服务器租用指南:配置选择与快速部署攻略  JS实现鼠标移上去显示图片或微信二维码  Laravel如何升级到最新版本?(升级指南和步骤)  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Linux系统命令中tree命令详解  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  Android实现代码画虚线边框背景效果  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Laravel如何集成Inertia.js与Vue/React?(安装配置)  如何用虚拟主机快速搭建网站?详细步骤解析  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  如何用狗爹虚拟主机快速搭建网站?  如何解决hover在ie6中的兼容性问题  如何快速选择适合个人网站的云服务器配置?  如何在IIS7上新建站点并设置安全权限?  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  jQuery validate插件功能与用法详解  Android Socket接口实现即时通讯实例代码  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  创业网站制作流程,创业网站可靠吗?  JavaScript如何实现错误处理_try...catch如何捕获异常?  怎么用AI帮你为初创公司进行市场定位分析?  如何在服务器上配置二级域名建站?