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()方法得到系统的默认解码方式。