Python 3 新增了 bytes 类型,用于代表字节串(这是本教程创造的一个词,用来和字符串对应)。字符串(str)由多个字符组成,以字符为单位进行操作;字节串(bytes)由多个字节组成,以字节为单位进行操作。

bytes 和 str 除操作的数据单元不同之外,它们支持的所有方法都基本相同,bytes 也是不可变序列。

bytes 对象只负责以字节(二进制格式)序列来记录数据,至于这些数据到底表示什么内容,完全由程序决定。如果采用合适的字符集,字符串可以转换成字节串;反过来,字节串也可以恢复成对应的字符串。

由于 bytes 保存的就是原始的字节(二进制格式)数据,因此 bytes 对象可用于在网络上传输数据,也可用于存储各种二进制格式的文件,比如图片、音乐等文件。

如果希望将一个字符串转换成 bytes 对象,有如下三种方式:

  1. 如果字符串内容都是 ASCII 字符,则可以通过直接在字符串之前添加 b 来构建字节串值。
  2. 调用 bytes() 函数(其实是 bytes 的构造方法)将字符串按指定字符集转换成字节串,如果不指定字符集,默认使用 UTF-8 字符集。
  3. 调用字符串本身的 encode() 方法将字符串按指定字符集转换成字节串,如果不指定字符集,默认使用 UTF-8 字符集。

例如,如下程序示范了如何创建字节串:

  1. # 创建一个空的bytes
  2. b1 = bytes()
  3. # 创建一个空的bytes值
  4. b2 = b''
  5. # 通过b前缀指定hello是bytes类型的值
  6. b3 = b'hello'
  7. print(b3)
  8. print(b3[0])
  9. print(b3[2:4])
  10. # 调用bytes方法将字符串转成bytes对象
  11. b4 = bytes('我爱Python编程',encoding='utf-8')
  12. print(b4)
  13. # 利用字符串的encode()方法编码成bytes,默认使用utf-8字符集
  14. b5 = "学习Python很有趣".encode('utf-8')
  15. print(b5)

上面程序中 b1~b5 都是字节串对象,该程序示范了以不同方式来构建字节串对象。其中 b2、b3 都是直接在 ASCII 字符串前添加b前缀来得到字节串的:b4 调用 bytes() 函数来构建字节串;而 b5 则调用字符串的 encode 方法来构建字节串。

运行上面程序,可以看到如下输出结果:

b'hello'
104
b'll'
b'\xe6\x88\x91\xe7\x88\xb1Python\xe7\xbc\x96\xe7\xa8\x8b'
b'\xe5\xad\xa6\xe4\xb9\xa0Python\xe5\xbe\x88\xe6\x9c\x89\xe8\xb6\xa3'

从上面的输出结果可以看出,字节串和字符串非常相似,只是字节串里的每个数据单元都是 1 字节。

计算机底层有两个基本概念:位(bit)和字节(Byte),其中 bit 代表 1 位,要么是 0,要么是 1,就像一盏灯,要么打开,要么熄灭;Byte 代表 1 字节,1 字节包含 8 位。

在字节串中每个数据单元都是字节,也就是 8 位,其中每 4 位(相当于 4 位二进制数,最小值为 0 ,最大值为 15)可以用一个十六进制数来表示,因此每字节需要两个十六进制数表示,所以可以看到上面的输出是 b'\xe6\x88\x91\xe7\x88\xb1Python\xe7\xbc\x96\xe7\xa8\x8b',比如 \xe6 就表示 1 字节,其中 \x 表示十六进制,e6 就是两位的十六进制数。

如果程序获得了 bytes 对象,也可调用 bytes 对象的 decode() 方法将其解码成字符串,例如,在上面程序中添加如下代码:

  1. #将bytes 对象解码成字符串,默认使用UTF-8进行解码
  2. st = b5.decode('utf-8')
  3. print(st)#学习Python很有趣

运行上面程序,可以看到如下输出结果:

学习Python很有趣

这里简单介绍一下字符集的概念。计算机底层并不能保存字符,但程序总是需要保存各种字符的,那该怎么办呢?计算机“科学家”就想了一个办法:为每个字符编号,当程序要保存字符时,实际上保存的是该字符的编号;当程序读取字符时,读取的其实也是编号,接下来要去查“编号一字符对应表”(简称码表)才能得到实际的字符。

因此,所谓的字符集,就是所有字符的编号组成的总和。早期美国人给英文字符、数字、标点符号等字符进行了编号,他们认为所有字符加起来顶多 100 多个,只要 1 字节(8 位,支持 256 个字符编号)即可为所有字符编号一一这就是 ASCII 字符集。

后来,亚洲国家纷纷为本国文字进行编号,即制订本国的字符集,但这些字符集并不兼容。于是美国人又为世界上所有书面语言的字符进行了统一编号,这次他们用了两个字节(16 位,支持 65536 个字符编号),这就是 Unicode 字符集。实际使用的 UTF-8, UTF-16 等其实都属于 Unicode 字符集。

由于不同人对字符的编号完全可以很随意,比如同一个“爱”字,我可以为其编号为 99,你可以为其编号为 199,所以同一个编号在不同字符集中代表的字符完全有可能是不同的。因此,对于同一个字符串,如果采用不同的字符集来生成 bytes 对象,就会得到不同的 bytes 对象。

14.Python bytes类型及用法的更多相关文章

  1. Python bytes类型及用法

    bytes 类型 Python 3 新增了 bytes 类型,用于代表字节串,是一个类型,不是C#中的列表. 字符串(str)由多个字符组成,以字符为单位进行操作: 字节串(bytes)由多个字节组成 ...

  2. python bytes类型

    python3中二进制数据则由bytes类型表示,8位一字节 格式化打印文件的二进制编码 with open('spiderman.mkv', "rb") as f: print( ...

  3. python bytes类型去除尾部字节

    by = b'\x01\x02' print(by) by = by.rstrip() print(by) by = by.rstrip(chr(2).encode()) print(by) b'\x ...

  4. Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型

    Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...

  5. Python 数据类型--Bytes类型

    一.Bytes类型 在Python3以后,字符串和bytes类型彻底分开了.字符串是以字符为单位进行处理的,bytes类型是以字节为单位处理的. bytes数据类型在所有的操作和使用甚至内置方法上和字 ...

  6. Python 3中的str和bytes类型

    Python3 中的str和bytes类型 Python3最重要的新特性之一是:对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Pyt ...

  7. Python str 与 bytes 类型(Python2/3 对 str 的处理)

    本文均在 Python 3 下测试通过,python 2.x 会略有不同. 1. str/bytes >> s = '123' >> type(s) str >> ...

  8. python字典转bytes类型字典

    python字典转bytes类型字典import base64 import json 1. a={"Vod":{"userData":"{}&quo ...

  9. python之路day06--python2/3小区别,小数据池的概念,编码的进阶str转为bytes类型,编码和解码

    python2#print() print'abc'#range() xrange()生成器#raw_input() python3# print('abc')# range()# input() = ...

随机推荐

  1. CF387B 【George and Round】

    暴力还真的出奇迹了这题窝将读入的两个数组都先排个序,然后再枚举一遍就过了: 目前题解最短的代码QwQ.这里是代码 #include<bits/stdc++.h>using namespac ...

  2. 2017.10.28 C组比赛总结

    这次比赛有点坑... [GDKOI2004]石子游戏 方法:判断奇偶性 输入n 如果n是奇数,输出 xiaoshi 如果n是偶数,输出 xiaoyong 比赛得分:30 错因:找错规律了(忘记了两个人 ...

  3. 剑指offer-数组中只出现一次的数字-数组-python

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.   # -*- coding:utf-8 -*- class Solution: # 返回[a, ...

  4. @RequestMapping-占位符映射

    占位符映射

  5. wpf ActualWidth为0解决方法

    LocalNewsControl() { var descriptor = DependencyPropertyDescriptor.FromProperty(ActualWidthProperty, ...

  6. 入门&常量&变量

    位:二进制中,每个0或1就是一个位,叫做bit(比特) 字节:计算机最小是存储单元(byte或B) 8bit = 1B 常用cmd命令: 启动: Win+R,输入cmd回车切换盘符 盘符名称:进入文件 ...

  7. Hbase1.4.9的安装

    HBase介绍 HBase – Hadoop Database,是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群. HB ...

  8. ffmpeg3.3.2命令行参数笔记

    组成: 1.libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含demuxers和muxer库: 2.libavcodec:用 ...

  9. kubernetes管理存储

    一.Kubernetes 如何管理存储资源: 理解volume 首先我们学习 Volume,以及 Kubernetes 如何通过 Volume 为集群中的容器提供存储:然后我们会实践几种常用的 Vol ...

  10. 利用nethogs查看哪些进程占用网络带宽

    一.安装nethogs centos6版本安装: 1.安装依赖包 [root@hlsms-fensheng- ~]# yum install ncurses* 已加载插件:fastestmirror, ...