广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python - 了解bytes、str
  • 480
分享到

Python - 了解bytes、str

Pythonbytesstr 2023-01-31 05:01:36 480人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

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

    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的区别

--结束END--

本文标题: Python - 了解bytes、str

本文链接: https://www.lsjlt.com/news/188171.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Python - 了解bytes、str
        Python3有两种表示字符序列的类型:bytes和str。前者的实例包含原始的8位值,后者的实例包含Unicode字符。    Python2也有两种表示字符序列的类型,分别叫做str和Unicode。与Python3不同的是,s...
    99+
    2023-01-31
    Python bytes str
  • Python中bytes与str的区别
    一、两种不同的数据类型 bytes是二进制数据,而str是Unicode文本。 在Python中,bytes是一个类型,用于代表字节串,是不可变序列,包含范围为0 <= x < 256的整数。bytes可以看做是bytearra...
    99+
    2023-10-29
    区别 Python bytes
  • Effective Python bytes 与 str 的区别
    目录1、Python 有两种类型可以表示字符序列2、Unicode 数据和二进制数据转换3、使用原始的 8 位值与 Unicode 字符串3.1 问题一:bytes 和 str 的实...
    99+
    2022-11-12
  • python str与bytes之间的转
      # bytes object   b = b"example"   # str object   s = "example"   # str to bytes   bytes(s, encoding = "utf8")   # b...
    99+
    2023-01-31
    python str bytes
  • Python中bytes和str的区别与联系详解
    目录Bytes和Str的区别Bytes与Str间的转换读写文件的注意事项总结Bytes和Str的区别 在Python3中,字符序列有两种类型:bytes和str。bytes类型是无符...
    99+
    2022-11-10
  • Python中bytes与str有什么区别
    这期内容当中小编将会给大家带来有关Python中bytes与str有什么区别,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。bytes实例包含的是原始数据,即8位的无符号值(通常按照ASCII编码标准来显示...
    99+
    2023-06-15
  • 怎么在python中将str转换成bytes
    这篇文章将为大家详细讲解有关怎么在python中将str转换成bytes,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python的数据类型有哪些python的数据类型:1. 数字类型,包括...
    99+
    2023-06-14
  • python中str和bytes怎么相互转化
    这篇文章主要介绍python中str和bytes怎么相互转化,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Python对代码格式的要...
    99+
    2023-06-14
  • 聊聊Python 3 的字符串:str 和 bytes 的区别
    Python2的字符串有两种:str 和 unicode,Python3的字符串也有两种:str 和 bytes。Python2 的 str 相当于 Python3 的bytes,而unicode相当于Python3的str。Python2...
    99+
    2023-06-02
  • python中str和bytes相互转化的示例分析
    这篇文章主要介绍了python中str和bytes相互转化的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。python的数据类型有哪些python的数据类型:1. 数...
    99+
    2023-06-14
  • python中的str代表了什么
    这篇文章主要介绍python中的str代表了什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Python对代码格式的要求没有那么严...
    99+
    2023-06-14
  • python基础字符串str详解
    目录字符串str:编码:ord(字符串)和chr(整数):字符串字面值:字符串通用操作字符串str: 定义:是由一系列字符组成的不可变序列容器,储存的事字符的编码值 编码:...
    99+
    2022-11-12
  • 详解python字符串相关str
    目录1:访str单个字符2: 字符串连接3:str切片4:使用in 和not in 测试字符串5:str方法6:重复操作符7:分割字符串总结1:访str单个字符 #for循环迭代 n...
    99+
    2022-11-12
  • 一起来了解c语言的str函数
    目录strlen:strcmp:strcpy:strcat:strstr:atoi:总结strlen: 用于求字符串长度,从首字符开始,到'\0'结束,'\0...
    99+
    2022-11-13
  • Python内建类型bytes深入理解
    目录引言1 bytes和str之间的关系2 bytes对象的结构:PyBytesObject3 bytes对象的行为3.1 PyBytes_Type3.2 bytes_as_sequ...
    99+
    2022-11-11
  • python内置函数bytes()用法详解
            python内置函数bytes返回一个新的bytes类型的对象,bytes类型对象是不可变序列,包含范围为 0 ...
    99+
    2023-09-05
    python bytes
  • python利用gzip压缩解压缩Str
    When working with a data stream instead of a file, use the GzipFileclass directly to compress or uncompress it. T...
    99+
    2023-01-31
    解压缩 python gzip
  • Python 字符串str详解(超详细)
    文章目录 Python内置函数/方法详解—字符串str1、创建字符串1.1 使用 ' ' 或 " " 创建字符串1.2 使用 str()函数 转换为字符串 2、访问字符串2.1 下标索引...
    99+
    2023-10-22
    python 开发语言 pycharm 后端 算法
  • Python中str is not callable问题详解及解决办法
    Python中str is not callable问题详解及解决办法 问题提出: 在Python的代码,在运行过程中,碰到了一个错误信息: python代码: def check_prov...
    99+
    2022-06-04
    解决办法 详解 Python
  • 怎么在Python中利用str()解决类型错误
    怎么在Python中利用str()解决类型错误?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。python有哪些常用库python常用的库:1.requesuts;2.scr...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作