Python进阶12_python中的字符与字节

python中的字符与字节

  • 字符和Unicode字符是什么,怎么表示
  • 什么字符的编码和解码
  • python中有什么字节类型
  • 如何创建字节
  • 字节有哪些方法何应用

python中字符的定义

字符的基础概念

**字符串:**由字符组成的序列
什么是字符呢?
字符: python中的定义是Unicode字符,

  • 在python3中,str对象中获取的元素是Unicode字符
  • 在python2中,str对象中获取的原始字节序列
Unicode字符

字符的标识(码位)

是 0~1 114 111 的数字(十进制),在 Unicode 标准中以 4~6 个十六进制数字表示,而且加前缀“U+”。
例如:字母A的码位是*U+0041,约 10% 的有效码位有对应的字符

字符的具体表述(编码)

编码是在码位和字节序列之间转换时使用的算法,有不同的编码算法,如: UTF-8,UTF-16LE.
例如 A的码位编成单个字节:\x41(UTF-8),\41\x00(UTF-16LE)

编码:把码位转换成字节序列的过程,把人类可读的文本字符串转换成机器可存储或传输的过程
解码:把字节序列转换成码位的过程,把机器码转换成人类可读的文本字符串的过程

# 定义一个字符串
s = 'café'
print(len(s))
# 将字符串编码
b = s.encode('utf8')
# “é”的码位编码成两个字节
print(b)
print(len(b))
# 将字符串解码
c = b.decode('utf8')
print(c)

d = '中国'
e = d.encode('utf8')
print(e)
print(len(e))
4
b'caf\xc3\xa9'
5
café
b'\xe4\xb8\xad\xe5\x9b\xbd'
6

字节的概念

bytes 与 bytearray

Python两种基本的二进制序列类型:

  • bytes:不可变类型
  • bytearray:可变类型
    python3中,它们对象的各个元素是介于 0~255(含)之间的整数,二进制序列的切片始终是同一类型的二进制序列.
    虽然二进制序列其实是整数序列,但是它们的字面量表示法表明其中有 ASCII 文本.
    各个字节的显示方式:
  • 可打印的 ASCII 范围内的字节(从空格到 ~),使用 ASCII 字符本身:比如这里的’caf’字符
  • 制表符、换行符、回车符和 \ 对应的字节,使用转义序列 \t、\n、\r 和 \
  • 其他字节的值,使用十六进制转义序列(例如,\x00 是空字节)
cafe = bytes('café',encoding='utf-8')
print(cafe)
#各个元素是 range(256) 内的整数
print(cafe[0])
#bytes 对象的切片还是 bytes 对象
print(cafe[:1])

cafe_arr = bytearray(cafe)
print(cafe_arr)
#bytearray 对象的切片还是 bytearray 对象
print(cafe_arr[-1:])

mby = bytes.fromhex('31 4B CE A9')
print(mby)
b'caf\xc3\xa9'
99
b'c'
bytearray(b'caf\xc3\xa9')
bytearray(b'\xa9')
b'1K\xce\xa9'
字节的方法

除 了 格 式 化 方 法(format 和 format_map) 和 几 个 处 理 Unicode 数 据 的 方 法( 包 括casefold、isdecimal、isidentifier、isnumeric、isprintable 和 encode) 之 外,str 类
型的其他方法都支持 bytes 和 bytearray 类型.

一个特殊的方法:fromhex 解析十六进制数字对构建二进制序列.

构建 bytes 或 bytearray 实例还可以调用各自的构造方法

  • 一个 str 对象和一个 encoding 关键字参数
  • 一个可迭代对象,提供 0~255 之间的数值
  • 一个整数,使用空字节创建对应长度的二进制序列
  • 一个实现了缓冲协议的对象,使用缓冲类对象构建二进制序列是一种低层操作,可能涉及类型转换
# 创建 bytes 或 bytearray 实例还可以调用各自的构造方法
import array
# 一个 str 对象和一个 encoding 关键字参数
b1 = bytes('瓦力人工智能',encoding='utf-8')
print(b1)
# 一个可迭代对象,提供 0~255 之间的数值
mylist = [i for i in range(1,254,50)]
print(mylist)
b2 = bytes(mylist)
print(b2)
# 一个整数,使用空字节创建对应长度的二进制序列
b3 = bytes(10)
print(b3)
# 一个实现了缓冲协议的对象
numbers = array.array('h',[-2,-1,0,1,2])
b4 = bytes(numbers)
print(b4)
b'\xe7\x93\xa6\xe5\x8a\x9b\xe4\xba\xba\xe5\xb7\xa5\xe6\x99\xba\xe8\x83\xbd'
[1, 51, 101, 151, 201, 251]
b'\x013e\x97\xc9\xfb'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\xfe\xff\xff\xff\x00\x00\x01\x00\x02\x00'

结构体和内存视图中字节的使用

struct 模块提供了一些函数,把打包的字节序列转换成不同类型字段组成的元组,也可以把元组转换成打包的字节序列

memoryview 类不是用于创建或存储字节序列的,而是共享内存,让你访问其他二进制序列、打包的数组和缓冲中的数据切片,而无需复制字节序列.

#使用 memoryview 和 struct 查看一个 GIF 图像的首部
import struct
# 结构体的格式:< 是小字节序,3s3s 是两个 3 字节序列,HH 是两个 16 位二进制整数
fmt = '<3s3sHH'
with open('imgs/01.gif','rb') as fp:
    #使用内存中的文件内容创建一个 memoryview 对象…
    img = memoryview(fp.read())
#然后使用它的切片再创建一个 memoryview 对象;这里不会复制字节序列  
header = img[:10]
#  转换成字节序列
bh = bytes(header)
print(bh)
#拆包 memoryview 对象,得到一个元组,包含类型、版本、宽度和高度
print(struct.unpack(fmt,header))
del header
del img
    

b'GIF89a\xe8\x03q\x01'
(b'GIF', b'89a', 1000, 369)

分享关于人工智能,机器学习,深度学习以及计算机视觉的好文章,同时自己对于这个领域学习心得笔记。想要一起深入学习人工智能的小伙伴一起结伴学习吧!扫码上车!

瓦力人工智能 - 扫码上车

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值