4. 二进制数据处理库

二进制处理库主要是针对二进制数据的操作和使用,也有介绍一些特定的操作,比如像文件格式和网络协议。

在前面也介绍了文本处理库,其实有一部分功能也是能处理二进制数据的,比如正则表达式re,或者是difflib比较库对数据进行处理。此外,在python内部也提供了bytes/bytearray/memoryview等数据类型进行操作。

4.1 struct--二进制数据打包和解包

本模块主要对python的数值与C结构表示为pythonbytes对象之间进行转换。通过此模块可以处理以二进制保存在文件里的数据,也可以处理网络连接之间相互传送的数据,或者其它来源的二进制数据。此模拟主要通过格式化字符串方式来描述C结构的保存格式,然后根据这个格式来读取或保存python内部表示的数据类型。

在模块struct里,很多函数都需要使用一个缓冲区参数,因而此缓冲区参数应实现buffer协议,并且提供读或者读写的功能。大多数情况下使用bytesbytearray都可以满足要求,不过其它类型也有实现buffer协议,基本上都是可以查看的功能。

4.1.1 函数和异常

本模块定义下面异常和函数功能:

exception struct.error

定义struct操作出错异常原因,struct.error是返回一个字符串描述出错原因。

例子:

#python 3.4.3

import struct

 

b = 0

 

try:

    print('测试')

    struct.pack('a', b)

except struct.error as error:

    print('异常出错提示:', error)

结果输出如下:

测试

异常出错提示: bad char in struct format

 

struct.pack(fmt, v1, v2, ...) 

把参数v1v2按格式fmt格式化填充到缓冲区,返回一个bytes对象。参数的个数和类型要与格式化字符串一致。

例子:

#python 3.4.3

import struct

 

print(struct.pack('hhl', 1, 2, 3))

结果输出如下:

b'\x01\x00\x02\x00\x03\x00\x00\x00'

 

struct.pack_into(fmt, buffer, offset, v1, v2, ...) 

把参数v1v2按格式fmt打包,并写入缓冲区对象buffer的开始位置offset处。注意位置参数offset一定要提供。

例子:

#python 3.4.3

import struct

 

buf = bytearray(10)

print(struct.pack_into('hhl', buf, 0, 1, 2, 3))

print(buf)

结果输出如下:

None

bytearray(b'\x01\x00\x02\x00\x03\x00\x00\x00\x00\x00')

 

struct.unpack(fmt, buffer) 

从一个缓冲区bytes对象buffer按格式化字符串进行解包,把解包出来的相应字段生成一个元组返回。缓冲区的大小应满足len(bytes)等于calcsize(fmt)大小。否则会抛出异常错误。

例子:

#python 3.4.3

import struct

 

buf = struct.pack('hhl', 1, 2, 3)

print(buf)

 

print(struct.unpack('hhl', buf))

结果输出如下:

b'\x01\x00\x02\x00\x03\x00\x00\x00'

(1, 2, 3)

 

struct.unpack_from(fmt, buffer, offset=0) 

从缓冲区buffer的指定位置offset,按格式fmt进行解包,把结果放到元组里。要求buffer[offset:]的大小至少大于calcsize(fmt)的大小。

例子:

#python 3.4.3

import struct

 

buf = bytearray(10)

struct.pack_into('hhl', buf, 0, 1, 2, 3)

print(buf)

 

tmp = struct.unpack_from('hhl', buf, 0)

print(tmp)

结果输出如下:

bytearray(b'\x01\x00\x02\x00\x03\x00\x00\x00\x00\x00')

(1, 2, 3)

 

struct.iter_unpack(fmt, buffer)

迭代地按格式fmt来解包缓冲区buffer,要求buffer的长度刚好是格式fmt的整数倍大小,否则抛出异常。与unpack()多次调用比较主要是提高解包的速度。

例子:

#python 3.4.3

import struct

 

buf = bytearray(20)

struct.pack_into('hhl', buf, 0, 1, 2, 3)

struct.pack_into('hhl', buf, 8, 4, 5, 6)

print(buf)

 

btBuf = bytes(buf[0:16])

for tmp in struct.iter_unpack('hhl', btBuf):

    print(tmp)

结果输出如下:

bytearray(b'\x01\x00\x02\x00\x03\x00\x00\x00\x04\x00\x05\x00\x06\x00\x00\x00\x00\x00\x00\x00')

(1, 2, 3)

(4, 5, 6)

 

struct.calcsize(fmt) 

计算给出格式字符串fmt来计算需要缓冲区的大小。

例子:

#python 3.4.3

import struct

 

print('hhl:', struct.calcsize('hhl'))

print('hhh:', struct.calcsize('hhh'))

结果输出如下:

hhl: 8

hhh: 6


蔡军生 QQ:9073204 深圳

python打包exe出错:Struct.error 希望高人能指导下。感谢了

04-08
哎呀呀,第一次打包,错误很多。然后一直查百度,解决了很多。 但是还是有几个不知道弄,所以求万能的CSDN,万能的大佬,万能的大神。 救救我这个新手小白吧。 代码如下: **** import tushare while 1 ==1: print("欢迎来到股票行情查询系统") X=str(input("请输入股票代码:")) A=X dateNow=tushare.get_realtime_quotes((A)) name=dateNow.loc[0][0] price=dateNow.loc[0][3] high=dateNow.loc[0][4] low=dateNow.loc[0][5] volumn=dateNow.loc[0][8] amount=dateNow.loc[0][9] openToday=dateNow.loc[0][1] pre_close=dateNow.loc[0][2] timee=dateNow.loc[0][30] print("***",name,"***") print("股票名:",name,"\n当前价格:",price,"\n最高价:",high,"\n最低价:",low,"\n成交量:",volumn,"\n成价额:",amount,"\n今日开盘价:",openToday,"\n收盘价:",pre_close,"\n时间",timee,)**** ******************************************************************************************************************************************************************************************************************************* 打包过程: ## **Microsoft Windows [版本 6.1.7601] ## 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。 ## ## ## C:\Users\Administrator>cd c:\a ## ## c:\a>pyinstaller -F -i a.ico nema.py ## 2608 INFO: PyInstaller: 3.4 ## 2608 INFO: Python: 3.7.2 ## 2609 INFO: Platform: Windows-7-6.1.7601-SP1 ## 2610 INFO: wrote c:\a\nema.spec ## 2611 INFO: UPX is not available. ## 2612 INFO: Extending PYTHONPATH with paths ## ['c:\\a', 'c:\\a'] ## 2612 INFO: checking Analysis ## 3850 INFO: checking PYZ ## 4210 INFO: checking PKG ## 4486 INFO: Bootloader c:\users\administrator\appdata\local\programs\python\pytho ## n37-32\lib\site-packages\PyInstaller\bootloader\Windows-32bit\run.exe ## 4486 INFO: checking EXE ## 4487 INFO: Building EXE because EXE-00.toc is non existent ## 4487 INFO: Building EXE from EXE-00.toc ## 4505 INFO: SRCPATH [('a.ico', None)] ## 4506 INFO: Updating icons from ['a.ico'] to C:\Users\ADMINI~1\AppData\Local\Temp ## \tmpks35ep37 ## Traceback (most recent call last): ## File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\Scripts ## \pyinstaller-script.py", line 11, in <module> ## load_entry_point('PyInstaller==3.4', 'console_scripts', 'pyinstaller')() ## File "c:\users\administrator\appdata\local\programs\python\python37-32\lib\sit ## e-packages\PyInstaller\__main__.py", line 111, in run ## run_build(pyi_config, spec_file, **vars(args)) ## File "c:\users\administrator\appdata\local\programs\python\python37-32\lib\sit ## e-packages\PyInstaller\__main__.py", line 63, in run_build ## PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs) ## File "c:\users\administrator\appdata\local\programs\python\python37-32\lib\sit ## e-packages\PyInstaller\building\build_main.py", line 838, in main ## build(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build' ## )) ## File "c:\users\administrator\appdata\local\programs\python\python37-32\lib\sit ## e-packages\PyInstaller\building\build_main.py", line 784, in build ## exec(text, spec_namespace) ## File "<string>", line 32, in <module> ## File "c:\users\administrator\appdata\local\programs\python\python37-32\lib\sit ## e-packages\PyInstaller\building\api.py", line 433, in __init__ ## self.__postinit__() ## File "c:\users\administrator\appdata\local\programs\python\python37-32\lib\sit ## e-packages\PyInstaller\building\datastruct.py", line 158, in __postinit__ ## self.assemble() ## File "c:\users\administrator\appdata\local\programs\python\python37-32\lib\sit ## e-packages\PyInstaller\building\api.py", line 522, in assemble ## icon.CopyIcons(tmpnm, self.icon) ## File "c:\users\administrator\appdata\local\programs\python\python37-32\lib\sit ## e-packages\PyInstaller\utils\win32\icon.py", line 177, in CopyIcons ## return CopyIcons_FromIco(dstpath, [srcpath]) ## File "c:\users\administrator\appdata\local\programs\python\python37-32\lib\sit ## e-packages\PyInstaller\utils\win32\icon.py", line 134, in CopyIcons_FromIco ## for i, f in enumerate(icons): ## File "c:\users\administrator\appdata\local\programs\python\python37-32\lib\sit ## e-packages\PyInstaller\utils\win32\icon.py", line 104, in __init__ ## entry.fromfile(file) ## File "c:\users\administrator\appdata\local\programs\python\python37-32\lib\sit ## e-packages\PyInstaller\utils\win32\icon.py", line 65, in fromfile ## self._fields_ = list(struct.unpack(self._format_, data)) ## struct.error: unpack requires a buffer of 16 bytes** 还有一个.ico的图标 希望能救救我这朵祖国的花朵。
©️2020 CSDN 皮肤主题: 鲸 设计师: meimeiellie 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值