返回顶部
首页 > 资讯 > 后端开发 > 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://lsjlt.com/news/188171.html(转载时请注明来源链接)

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

猜你喜欢
  • Python - 了解bytes、str
        Python3有两种表示字符序列的类型:bytes和str。前者的实例包含原始的8位值,后者的实例包含Unicode字符。    Python2也有两种表示字符序列的类型,分别叫做str和Unicode。与Python3不同的是,s...
    99+
    2023-01-31
    Python bytes str
  • 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
  • Effective Python bytes 与 str 的区别
    目录1、Python 有两种类型可以表示字符序列2、Unicode 数据和二进制数据转换3、使用原始的 8 位值与 Unicode 字符串3.1 问题一:bytes 和 str 的实...
    99+
    2024-04-02
  • Python中bytes与str的区别
    一、两种不同的数据类型 bytes是二进制数据,而str是Unicode文本。 在Python中,bytes是一个类型,用于代表字节串,是不可变序列,包含范围为0 <= x < 256的整数。bytes可以看做是bytearra...
    99+
    2023-10-29
    区别 Python bytes
  • python3.x中str,bytes类
    在研究Python3.x的过程中,遇到的一个纠结了我几天的问题:总是提示“a bytes-like object is required,not 'str' ”在python3.x里增加了bytes类型,并且对str方法进行了修改,让str...
    99+
    2023-01-31
    str bytes
  • Python中bytes和str的区别与联系详解
    目录Bytes和Str的区别Bytes与Str间的转换读写文件的注意事项总结Bytes和Str的区别 在Python3中,字符序列有两种类型:bytes和str。bytes类型是无符...
    99+
    2024-04-02
  • Python中bytes与str有什么区别
    这期内容当中小编将会给大家带来有关Python中bytes与str有什么区别,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。bytes实例包含的是原始数据,即8位的无符号值(通常按照ASCII编码标准来显示...
    99+
    2023-06-15
  • Python3中str、bytes、bytearray转化
    目录简介str转bytesbytes转strbytes和str转化为bytearray简介 str是采用Unicode编码方式的序列,主要用于显示bytes是字节序列,主要用于网络和...
    99+
    2023-05-14
    Python3 str bytes bytearray 转化
  • 怎么在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
  • 浅析Python3中的bytes和str
    Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes,你不能拼接字符串和字节流,也无...
    99+
    2023-01-31
    bytes str
  • python中str和bytes相互转化的示例分析
    这篇文章主要介绍了python中str和bytes相互转化的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。python的数据类型有哪些python的数据类型:1. 数...
    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
  • Python3中的bytes类型和str类型
    目录前言:编码发展的历史bytes和str之间的异同前言: Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分。文本总是Unicode,由str类型表示,二进制...
    99+
    2024-04-02
  • python3 字符串str和bytes相互转换
    目录1.相关基础2.str和bytes相互转换2.1 bytes->str2.2 str->bytes1.相关基础 python3中有两种字符串类型:str和bytes ...
    99+
    2024-04-02
  • Python3中str、bytes、bytearray转化的方法是什么
    这篇文章主要讲解了“Python3中str、bytes、bytearray转化的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python3中str、bytes、bytearray...
    99+
    2023-07-05
  • python中的str代表了什么
    这篇文章主要介绍python中的str代表了什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Python对代码格式的要求没有那么严...
    99+
    2023-06-14
  • Python -- str 类
    Python str类常用方法:class str(object):     def capitalize(self):   # 全部字母变小写只有首字母变大写;                         >>> t...
    99+
    2023-01-31
    Python str
  • Python中的bytes
    bytes_lst = [   ('创建bytes',),   ('bytes可哈希',),   ('编码与解码',),   ('常见编码类型',),   ('ord() 与 chr()',), ]   创建bytes   &g...
    99+
    2023-01-30
    Python bytes
  • Python int,bytes, st
    int转bytes:     python2/3中,使用six.int2byte():     b = six.int2byte(1)     得到的结果是b = b'\x01'   ...
    99+
    2023-01-31
    int Python st
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作