python中字符串格式化使用的符号,python变为字符串
Stuct模块主要用于将Python中的值转换成C语言的strtucture。本文主要介绍Python basic notes的结构和格式化字符的相关信息。通过示例代码详细介绍,有需要的朋友可以参考一下。
00-1010结构格式字符串字节顺序、大小和对齐格式字符格式数字格式字符格式字符串填充影响复杂应用程序摘要中的方法介绍
目录
文件的内容有两种存储方式,一种是二进制,一种是文本。如果是以文本的形式存储在文件中,那么在从文件中读取时,会遇到一个将文本转换成Python中的数据类型的问题。其实即使是以文本的形式存储,存储的数据也是结构化的,因为Python的底层是用C写的,这里也叫C结构。
Lib/struct.py就是负责这种结构转换的模块。
简介
先看struct的定义:
__all__=[
#函数
calcsize , pack , pack_into , unpack , unpack_from ,
iter_unpack ,
类别数量
结构,
#例外
错误
]
有6个方法和1个例外。
我们主要看这6种方法的使用:
方法函数struct.pack(格式,v1,v2,)返回一个bytes对象,该对象包含值v1、v2、按照格式字符串格式打包。参数的数量必须与格式字符串要求的值完全匹配。Struct.pack _ into(格式,缓冲区,偏移量,v1,v2,)包v1,v2,根据格式字符串的格式,将打包后的字节字符串从偏移量开始写入可写缓冲区。请注意,offset是必需的参数。Struct.unpack(format,buffer)根据格式字符串格式从缓冲区解包(假设是pack(format,)).返回的结果是一个元组,即使它只包含一个条目。缓冲区的字节大小必须与格式要求的大小相匹配。Struct.unpack _ from (format,/,buffer,offset=0)根据格式字符串格式从位置偏移量开始解包缓冲区。结果是一个元组,即使它只包含一个条目。Struct.iter _ unpack (format,buffer)根据格式字符串格式,以迭代的方式从缓冲区中解包。这个函数返回一个迭代器,它将从缓冲区中读取相同大小的块,直到其内容全部用完。Struct.calcsize(format)返回格式字符串format对应的结构的大小(即pack(format,)).这些方法主要是打包和解包的操作。其中一个最重要的参数是格式,也称为格式字符串。它指定了每个字符串的打包格式。
struct中的方法
格式是一种机制,用于在打包和解包数据时指定数据格式。它们由指定要打包/解包的数据类型的格式字符构成。此外,一些特殊字符用于控制字节顺序、大小和对齐。
格式字符串
默认情况下,C类型以机器的本机格式和字节顺序表示,并在必要时通过填充字节正确对齐(根据C编译器使用的规则)。
我们还可以手动指定格式字符串的字节顺序、大小和对齐方式:
消息
符
大端和小端是两种数据存储方式。
第一种Big Endian将高位的字节存储在起始地址
第二种Little Endian将地位的字节存储在起始地址
其实Big Endian更加符合人类的读写习惯,而Little Endian更加符合机器的读写习惯。
目前主流的两大CPU阵营中,PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。
如果不同的CPU架构直接进行通信,就由可能因为读取顺序的不同而产生问题。
填充只会在连续结构成员之间自动添加。 填充不会添加到已编码结构的开头和末尾。当使用非原字节大小和对齐方式即 '<', '>', '=', and '!' 时不会添加任何填充。
格式字符
我们来看下字符都有哪些格式:
格式数字
举个例子,比如我们要打包一个int对象,我们可以这样写:
In [101]: from struct import *In [102]: pack(i,10)
Out[102]: b\n\x00\x00\x00
In [103]: unpack(i,b\n\x00\x00\x00)
Out[103]: (10,)
In [105]: calcsize(i)
Out[105]: 4
上面的例子中,我们打包了一个int对象10,然后又对其解包。并且计算了 i 这个格式的长度为4字节。
大家可以看到输出结果是 b'\n\x00\x00\x00' ,这里不去深究这个输出到底是什么意思,开头的b表示的是byte,后面是byte的编码。
格式字符之前可以带有整数重复计数。 例如,格式字符串 '4h' 的含义与 'hhhh' 完全相同。
看下如何打包4个short类型:
In [106]: pack(4h,2,3,4,5)Out[106]: b\x02\x00\x03\x00\x04\x00\x05\x00
In [107]: unpack(4h,b\x02\x00\x03\x00\x04\x00\x05\x00)
Out[107]: (2, 3, 4, 5)
格式之间的空白字符会被忽略,但如果是struct.calcsize 方法的话格式字符中不可有空白字符。
当使用某一种整数格式 ('b', 'B', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q') 打包值 x 时,如果 x 在该格式的有效范围之外则将引发 struct.error。
格式字符
除了数字之外,最常用的就是字符和字符串了。
我们先看下怎么使用格式字符,因为字符的长度是1个字节,我们需要这样做:
In [109]: pack(4c,ba,bb,bc,bd)Out[109]: babcd
In [110]: unpack(4c,babcd)
Out[110]: (ba, bb, bc, bd)
In [111]: calcsize(4c)
Out[111]: 4
字符前面的b,表示这是一个字符,否则将会被当做字符串。
格式字符串
再看下字符串的格式:
In [114]: pack(4s,babcd)Out[114]: babcd
In [115]: unpack(4s,babcd)
Out[115]: (babcd,)
In [116]: calcsize(4s)
Out[116]: 4
In [117]: calcsize(s)
Out[117]: 1
可以看到对于字符串来说calcsize返回的是字节的长度。
填充的影响
格式字符的顺序可能对大小产生影响,因为满足对齐要求所需的填充是不同的:
>>> pack(ci, b*, 0x12131415)b*\x00\x00\x00\x12\x13\x14\x15
>>> pack(ic, 0x12131415, b*)
b\x12\x13\x14\x15*
>>> calcsize(ci)
8
>>> calcsize(ic)
5
下面的例子我们将会展示如何手动影响填充效果:
In [120]: pack(llh,1, 2, 3)Out[120]: b\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00
上面的例子中,我们打包1,2,3这三个数字,但是格式不一样,分别是long,long,short。
因为long是4个字节,short是2个字节,所以本质上是不对齐的。
如果想要对齐,我们可以在后面再加上 0l 表示0个long,从而进行手动填充:
In [118]: pack(llh0l, 1, 2, 3)Out[118]: b\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00
In [122]: unpack(llh0l,b\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00)
Out[122]: (1, 2, 3)
复杂应用
最后看一个复杂点的应用,这个应用中直接从unpack出来的数据读取到元组中:
>>> record = braymond \x32\x12\x08\x01\x08>>> name, serialnum, school, gradelevel = unpack(<10sHHb, record)
>>> from collections import namedtuple
>>> Student = namedtuple(Student, name serialnum school gradelevel)
>>> Student._make(unpack(<10sHHb, record))
Student(name=braymond , serialnum=4658, school=264, gradelevel=8)
总结
到此这篇关于Python基础笔记之struct和格式化字符的文章就介绍到这了,更多相关Python struct和格式化字符内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。