Python 字符串(string)和字节型(bytes)
- 1. 编码常识
- 比特、字节、字符
- ASCII编码
- GBK
- Unicode
- UTF-8编码
- 小结
- 2. Python3字符串和字节型
- 概述
- 用法
- 小结
- 文本字符串和字节字符串
- 3. 应用
- 文本
字符串平常用的比较多,该篇主要记录一下Python处理字节型,顺便对基础知识做一下回顾和小结。
Python3最重要的新特性之一是对字符串和二进制数据流做了明确的区分:
- 文本总是
Unicode
,由str类型
表示 - 二进制数据则由
bytes类型
表示 - Python3不会以任意隐式的方式
混用str和bytes
你不能拼接字符串和字节流,也无法在字节流里搜索字符串(反之亦然),也不能将字符串传入参数为字节流的函数(反之亦然)
1. 编码常识
比特、字节、字符
- 计算机存储信息的最小单位,称之为
位(bit)
,音译为比特,二进制的一个“0”或一个“1”叫一位。 - 计算机存储容量基本单位是
字节(Byte)
,音译为拜特,8个二进制位组成1个字节。
最早的计算机在设计时采用8个比特(bit)作为一个字节(byte)
所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。
- 计算机存储容量大小以字节数来度量,1024进位制
1024B=1K(千)B
1024KB=1M(兆)B
1024MB=1G(吉)B
1024GB=1T(太)B
- 字符是一种符号,同以上说的存储单位不是一回事,是指计算机中使用的文字和符号。
ASCII编码
- 只能表示127个字符,包括大小写英文字母、数字和一些符号
- 用一个字节表示一个字符
GBK
Unicode
- 把所有语言都统一到一套编码里
- 用两个字节表示一个字符
UTF-8编码
- 把Unicode编码转化为“可变长编码”
- UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。
小结
- 在计算机内存中,统一使用Unicode编码
- 当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
2. Python3字符串和字节型
概述
- Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节
- 如果要在网络上传输,或者保存到磁盘上,就需要把str 编码以字节为单位的bytes,即网络传输和接收到的数据都是
bytes
,如过想要解读则需要将bytes 解码为str
bytes只负责以字节序列的形式(二进制形式)来存储数据,至于这些数据到底表示什么内容(字符串,数字,图片,音频等),完全由程序的解析方式决定,如果采用合适的字符编码方式(字符集),字节串可以恢复成字符串,反之亦然,字符串也可以转换成字节串。
用法
- bytes类型:
x = b'ABC'
;str类型:x = ‘ABC’
要注意区分
'ABC'
和b'ABC'
:'ABC'
是str,b'ABC'
的内容虽然显示得和前者一样,但bytes
的每个字符都只占用一个字节。
str
(以Unicode表示)编码为指定bytes
:'ABC'.encode('ascii')
或者'中文'.encode('utf-8')
注意:
纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。
含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。
- 在
bytes
中,无法显示为ASCII字符的字节,用\x##
显示
这句话意思是,对于bytes,不被ASCII表示的字符,用\x##
显示出来 - 计算
str
包含度多少字符:len(str)
- 计算
bytes
包含的字节数:len(bytes)
小结
- 在将字符串存入磁盘和从磁盘读取字符串的过程中,Python自动地帮你完成了编码和解码的工作,你不需要关心它的过程。
- 使用bytes类型,实质上是告诉Python,不需要它帮你自动地完成编码和解码的工作,而是用户自己手动进行,并指定编码格式。
- Python已经严格区分了bytes和str两种数据类型,你不能在需要bytes类型参数的时候使用str参数,反之亦然。这点在读写磁盘文件时容易碰到。
- python3默认的编码时,Unicode用字符串表示,二进制数据由bytes类型表示。
- encode:将str转换为bytes,是一个编码的过程;decode:将bytes转换为str,是一个解码的过程
- 一句话总结?:不论是网络传输还是保存到硬盘上,都是脱离了内存空间,所以可以粗略的概括为在内存里以Unicode编码(Python3 str类型)存在,想要离开内存就必须转换为字节型(Python3 bytes类型))
文本字符串和字节字符串
第一次看到“文本字符串”就有些懵逼,后来才明白文本字符串类型就是str类型
嘛。
Python语言有两种不同的字符串,一个用于存储文本,一个用于存储原始字节:
- 文本字符串内部使用Unicode存储,Python3中被命名为str
- 字节字符串存储原始字节并显示ASCII,Python3中被命名为bytes。
3. 应用
文本
文件总是存储字节,为了使用文件中读取的文本数据,必须首先将其解码为一个文本字符串。
python3中,文本正常情况下会自动为你解码,所以打开或读取文件会得到一个文本字符串。
使用的解码方式取决系统,在mac os 或者 大多数linux系统中,首选编码是utf-8,但windows不一定。
可以使用locale.getpreferredencoding()方法得到系统的默认解码方式。