1、bytes与bytearray
# bytes:不可变字节序列; bytearray:字节数组,可变数据类型;
(1)bytes定义
class bytes(object): """ (1)bytes(iterable_of_ints) -> bytes (2)bytes(string, encoding[, errors]) -> bytes (3)bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer (4)bytes(int) -> bytes object of size given by the parameter initialized with null bytes # 指定字节的bytes,被0填充;
b=bytes(10) # 创建10个字节的bytes;
print(b) # ==> b'x00x00x00x00x00x00x00x00x00x00'; (5)bytes() -> empty bytes object # 创建空bytes;
# 注意:bytes类型,使用b前缀定义;
只允许基于ASCII使用字符串形式b'abc9'表示
使用16进制表示b'x41x61'
(2)bytearray定义
class bytearray(object): """ bytearray(iterable_of_ints) -> bytearray bytearray(string, encoding[, errors]) -> bytearray bytearray(bytes_or_buffer) -> mutable copy of bytes_or_buffer bytearray(int) -> bytes array of size given by the parameter initialized with null bytes bytearray() -> empty bytes array
# b=bytearray(5)
# print(b) # bytearray(b'x00x00x00x00x00')
2、字符编码
2.1、 什么是字符编码?
# 个人理解为:将人类理解的字符<===>翻译过程<===>计算机能够识别的数字;
# 这个过程就是讲字符如何对应一个特定的数字的标准,这个标准即为:‘字符编码’;
2.2、字符编码表
(1)ASCII码表
# 由于计算机最早是美国人发明的,所以有了第一张英文字符集与计算机数字对应的表;
# ASCII:一个Bytes代表一个字符,1Bytes=8bit,8bit可以表示0-2**8-1=256个字符;
(2)GBK编码表
# GBK:2Bytes代表一个中文字符,1Bytes表示一个英文字符;==>GB2312(ANSI)==>GBK==>GB18030;(解决了中文与计算机识别数字对应关系)
(3)Unicode万国码
# Unicode(定长):统一用2Bytes代表一个字符;与全世界所有的字符编码都有映射关系,这样就可以转换成任意国家的字符编码;Unicode只是存放了与其他编码的映射关系;
(4)utf-8(可变长)
# 对于英文来说,如果采用Unicode则存储空间浪费太多(1倍),UTF-8:英文字符1Bytes,中文字符采用3Bytes;
# 总结:内存中统一采用Unicode编码;硬盘可以采用各种编码方法存储数据,一般采用UTF-8编码;
2.3、编码(encode)与解码(decode)
# 通常来说:读取文件需要decode(解码),写入文件需要encode(编码);
编码过程:字符== >字节流;计算机处理的是字节流而不是字符,所以编码是以特定的方式把字符变成字节流;
解码过程:字节流==>字符;
# 具体过程如下:
从硬盘读取文件到内存:utf-8 ==>decode==>unicode
从内存将文件保存到硬盘:unicode==>encode==>utf-8
# 注意:保证不乱码的原则为:
(1)以什么编码格式存文件,就以什么编码格式取(读)文件;
(2)例如:如果以ascii编码格式存中文,则一定乱码,存的时候数据就损坏了;一定要在编码支持范围内存取和读取文件;
2.4、python字符编码应用
# python3的解释器默认utf-8编码,python2的解释器默认为ascii编码;所以默认python3解释器支持识别中文;
# 以python test.py为例:(执行test.py的第一步一定是将文件内容从硬盘读取到内存中)
# 将test.py的内容:
line1:# coding:gbk
line2:“你好
line3:x=‘你好’
以GBK编码格式保存;
# 分析整个程序的运行过程:
(1)第一阶段:启动python解释器
(2)第二阶段:python解释器此时就是一个文本编辑器,负责打开test.py,即从硬盘中读取test.py的内容到内存;
# 此时python解释器读取test.py的第一行内容# coding:gbk,来决定以什么编码格式读入到内存,这一行是用来设定python解释器这个软件的编码格式;
# 可以使用sys.getdefaultencoding()查看,如果在文件开头没有指定,python2则使用ascii编码,python3则为unicode;
(3)第三阶段:读取已经加载到内存的test.py代码(unicode格式编码),然后执行;执行过程中可能会开辟新的内存空间,次内存空间和之前的是不同的2个空间;
# 例如:执行到x=‘nihao’,会申请新的内存空间,然后以unicode的编码方式存在内存中;
(4)关于终端打印print
# 例如: print(x) 输出实际时候用的是终端的编码,保证不乱码则需要,文件的读,存以及打印的终端的编码格式一致;