我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python - 了解bytes、str

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python - 了解bytes、str

    Python3有两种表示字符序列的类型:bytes和str。前者的实例包含原始的8位值,后者的实例包含Unicode字符。
    Python2也有两种表示字符序列的类型,分别叫做str和Unicode。与Python3不同的是,str实例包含原始的8位值;而unicode的实例,则包含Unicode字符。
    把Unicode字符表示为二进制数据(也就是原始8位值)有许多种办法。最常见的编码方式就是UTF-8。但是,Python3的str实例和Python2的unicode实例都没有和特定的二进制编码形式相关联。要想把Unicode字符转换成二进制数据,就必须使用encode方法。要想把二进制数据转换成Unicode字符,则必须使用decode方法。
    编写Python程序的时候,一定要把编码和解码操作放在界面最外围来做。程序的核心部分应该使用Unicode字符类型(也就是Python3中的str、Python2中的unicode),而且不要对字符编码做任何假设。这种办法既可以令程序接受多种类型的文本编码(如Latin-1、Shift JIS和Big5),又可以保证输出的文本信息只采用一种编码形式(最好是UTF-8)。
    由于字符类型有别,所以Python代码中经常会出现两种常见的使用情境:
开发者需要原始8位值,这些8位值表示以UTF-8格式(或其他编码形式)来编码的字符。
开发者需要操作没有特定编码形式的Unicode字符。
    所以,我们需要编写两个辅助(helper)函数,以便在这两种情况之间转换,使得转换后的输入数据能够符合开发者的预期。

#在Python3中,我们需要编写接受str或bytes,并总是返回str的方法:
def to_str(bytes_or_str):
  if isinstance(bytes_or_str, bytes):
    value = bytes_or_str.decode('utf-8')
  else:
    value = bytes_or_str
  return value # Instance of str
  
#另外,还需要编写接受str或bytes,并总是返回bytes的方法:
def to_bytes(bytes_or_str):
  if isinstance(bytes_or_str, str):
    value = bytes_or_str.encode('utf-8)
  else:
    value = bytes_or_str
  return value # Instance of bytes
  
#在Python2中,需要编写接受str或unicode,并总是返回unicode的方法:
#python2
def to_unicode(unicode_or_str):
  if isinstance(unicode_or_str, str):
    value = unicode_or_str.decode('utf-8')
  else:
    value = unicode_or_str
  return value # Instance of unicode
  
#另外,还需要编写接受str或unicode,并总是返回str的方法:
#Python2
def to_str(unicode_or_str):
  if isinstance(unicode_or_str, unicode):
    value = unicode_or_str.encode('utf-8')
  else:
    value = unicode_or_str
  reutrn vlaue # Instance of str

    在Python中使用原始8位值与Unicode字符时,有两个问题需要注意。
    第一个问题可能会出现在Python2里面。如果str只包含7位ASCII字符,那么unicode和str实例似乎就成了同一种类型。
     *可以用+操作符把这种str与unicode连接起来。
     *可以用等价于不等价操作符,在这种str实例与unicode实例之间进行比较。
     * 在格式字符串中,可以用’%s’等形式来代表unicode实例。
    这些行为意味着,在只处理7位ASCII的情境下,如果某函数接受str,那么可以给它传入unicode;如果某函数接受unicode,那么也可以给它传入str。而在Python3中,bytes与str实例则绝对不会等价,即使是空字符串也不行。所以,在传入字符序列时必须留意其类型。

    第二个问题可能会出现在Python3里面。如果通过内置的open函数获取了文件句柄,那么请注意,该句柄默认会采用UTF-8编码格式来操作文件。而在Python2中,文件操作的默认编码格式则是二进制形式。这可能会导致程序出现怪的错误,对习惯了Python2的程序员来说更是如此。
    例如,现在要向文件中随机写入一些二进制数据。下面这种用法在Python2中可以正常运作,但在Python3中不行。

with open('/tmp/random.bin','w') as f:
  f.write(os.urandom(10))
>>>
TypeError: must be str, not bytes

 发生上述异常的原因在于,Python3给open函数添加了名为encoding的新参数,而这个新参数的默认值是’utf-8’。这样在文件句柄上进行read和write操作时,系统就要求开发者必须传入包含Unicode字符的str实例,而不接受包含二进制数据的bytes实例。
    为了解决这个问题,我们必须用二进制写入模式(’wb’)来开启待操作的文件,而不能像原来那样,采用字符写入模式(‘w’)。按照下面这种方式来使用open函数,即可同时适配Python2与Python3:

with open('/tmp/ramdom.bin','wb') as f:
  f.write(os.urandom(10))

   从文件中读取数据的时候也有这种问题。解决办法与写入时相似:用’rb’模式(也就是二进制模式)打开文件,而不要用’r’模式。

要点:
- 在Python3中,bytes是一种包含8位值的序列,str是一种包含Unicode字符的序列。开发者不能以>或+等操作符来混同操作bytes和str实例。
- 在Python2中,str是一种包含8位值的序列,unicode是一种包含Unicode字符的序列。如果str只含有7位ASCII字符,那么可以通过相关的操作来同时使用str和unicode。
- 在对输入的进行操作之前,使用辅助函数来保证字符序列的类型与开发者的期望相符(有的时候,开发者想操作以UTF-8格式来编码的8位值,有的时候,则想操作Unicode字符)。
- 从文件中读取二进制数据,或向其中写入二进制数据时,总应该以’rb’或’wb’等二进制模式来开启文件。


摘自《编写高质量Python代码的59个有效方法》--第三条:了解bytes、str与unicode的区别

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python - 了解bytes、str

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python - 了解bytes、str

Python3有两种表示字符序列的类型:bytes和str。前者的实例包含原始的8位值,后者的实例包含Unicode字符。    Python2也有两种表示字符序列的类型,分别叫做str和Unicode。与Python3不同的是,str实例
2023-01-31

python str与bytes之间的转

# bytes object  b = b"example"  # str object  s = "example"  # str to bytes  bytes(s, encoding = "utf8")  # bytes to str
2023-01-31

Python中bytes与str的区别

Python中bytes与str的区别主要是它们是两种不同的数据类型。bytes是二进制数据,而str是Unicode文本。在Python中,bytes是一个类型,用于代表字节串,是不可变序列,包含范围为0 <= x < 256的整数。bytes可以看做是bytearray的不可变版本,它同样支持索引和切片操作。
Python中bytes与str的区别
2023-10-29

Python中bytes与str有什么区别

这期内容当中小编将会给大家带来有关Python中bytes与str有什么区别,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。bytes实例包含的是原始数据,即8位的无符号值(通常按照ASCII编码标准来显示
2023-06-15

python中str和bytes怎么相互转化

这篇文章主要介绍python中str和bytes怎么相互转化,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Python对代码格式的要
2023-06-14

怎么在python中将str转换成bytes

这篇文章将为大家详细讲解有关怎么在python中将str转换成bytes,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python的数据类型有哪些?python的数据类型:1. 数字类型,包
2023-06-14

python中str和bytes相互转化的示例分析

这篇文章主要介绍了python中str和bytes相互转化的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。python的数据类型有哪些?python的数据类型:1.
2023-06-14

聊聊Python 3 的字符串:str 和 bytes 的区别

Python2的字符串有两种:str 和 unicode,Python3的字符串也有两种:str 和 bytes。Python2 的 str 相当于 Python3 的bytes,而unicode相当于Python3的str。Python2
2023-06-02

python中的str代表了什么

这篇文章主要介绍python中的str代表了什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Python对代码格式的要求没有那么严
2023-06-14

python利用gzip压缩解压缩Str

When working with a data stream instead of a file, use the GzipFileclass directly to compress or uncompress it. This is
2023-01-31

Python中str is not callable问题详解及解决办法

Python中str is not callable问题详解及解决办法 问题提出:在Python的代码,在运行过程中,碰到了一个错误信息:python代码:def check_province_code(province, country)
2022-06-04

怎么在Python中利用str()解决类型错误

怎么在Python中利用str()解决类型错误?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。python有哪些常用库python常用的库:1.requesuts;2.scr
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录