当前简讯:Python工具箱系列(三十七)
时间:2023-06-26 12:16:26来源:博客园

二进制文件操作(上)

python比较擅长与文本相关的操作。但现实世界中,对于非文本消息的处理也很普遍。例如:

◆通过有线、无线传递传感器获得的测量数据。

◆卫星通过电磁波发送测量数据。


【资料图】

◆数据中心的数万台服务器发送当前CPU的占用率信息、内存占用量等众多指标数据。

以上数据,当然可以以文本方式发送,但是对于带宽的占用惊人。假设某个对于PM2.5进行测量的传感器,每隔一秒发送一次测量数据,以文本方式发送消息,内容如下:

"counter: 1, pm25: 170.24119426834042, timestamp: 2022-07-24 08:52:11.138894+00:00"

以上消息占用了81个字节。而如果能够按照约定的格式直接发送二进制数据,则只需要20个字节,可以大幅提升传输效率。此外,以文本方式在本地保存传感器数据,则一天就需要81*86400/1024=6834M字节,对于传感器这种体积小巧的嵌入式系统,存储空间极为有限,很快就会空间耗尽。因此,对非文本数据直接保存与读取非常有必要。下面的代码演示了传感器类,以及传感器测量数据的二进制文件存储与读取的基本操作。

import binasciiimport randomimport structfrom datetime import datetimefrom io import BytesIOfrom time import sleepimport arrowclass sensordata_v1():    def __init__(self):        utc = arrow.utcnow()        self._timestamp = utc.to("Asia/Shanghai")    @property    def counter(self) -> int:        """        计数器        Returns:            int: 从0开始的计数器        """        return self._counter    @counter.setter    def counter(self, value: int):        self._counter = value    @property    def pm25(self) -> float:        """        PM25测量值        Returns:            float: pm25的当前测量值        """        return self._pm25    @pm25.setter    def pm25(self, value: float):        self._pm25 = value    @property    def timestamp(self) -> datetime:        """        当前时点        Returns:            datetime: 当前的时间        """        return self._timestamp.datetime    def __str__(self):        """        以文字输出相关内容        Returns:            string: 说明性文字        """        return f"counter: {self.counter}, pm25: {self.pm25}, timestamp: {self.timestamp}"    def __repr__(self):        """        输出字节流的16进制内容        Returns:            string: 16进制显示相关数值        """        return str(binascii.hexlify(self.toBytes()))    def toBytes(self):        """        将相关数据转换成为bytes,便于网络传输或者写入文件        Returns:            bytes: 整合测量数据到字节流中        """        with BytesIO() as byio:            byio.write(struct.pack("

其中arrow是非常值得推荐的时间处理框架。python有内置的时间处理框架,功能非常完善,但失之于乱与杂,掌握起来非常不易。而arrow则非常人性化,做到了拿来即用。其安装过程非常简单,直接pip install arrow即可。在示例程序中,为了能够方便存储,我们将时间戳直接用UNIX的timestamp来表示,转换后为了保持精度,本例使用double(8字节)存储,如果要求不高,可以改为float(4字节)。

sensordata_v1类使用@property装饰器来定义属性。总共有3个属性:

◆counter-计数器。从0开始计数累加,后续保存到数据库中时也方便检索。

◆pm25-PM2.5测量值。在示例代码中使用random.uniform模拟一个0到300的随机浮点值,没有什么太大的意义,保证每次不同即可。

◆timestamp-数据采集时的对应时间。

str类函数

可以自定义,本例中用它来直观的表示当前的采集值。当对sensordata_v1类的实例打印时,就会自动调用这个函数。

repr类函数

可以自定义,本例中用它来演示转换成为字节流bytes时的16进制值。对于程序员来说,16进制来表示字节是比较自然的。

toBytes类函数具体展示了如何将类的属性值转换成为二进制字节流,主要依靠python内置的struct模块。在内存中模拟文件打开一个BytesIO,并且依次写入struct.pack编码后的字节流,最终统一输出。

fromBytes类函数具体展示了如何从字节流反解成为对象的属性值。struct.pack与struct.unpack成对出现。

toFile函数将编码好的字节流写入二进制文件。写入的模式为"wb",其中w代表全覆盖写入的意思,b代表二进制模式的意思。fromFile负责从二进制文件读回保存的字节流,重新生成各个sensordata_v1对象。

生成的二进制文件,可以使用UltraEditor、InHex等。也可以直接使用vscode自带的2进制文件浏览器扩展Hex Editor,显示效果如下图所示:

从图中可以看出,二进制文件确实节省空间,但人类不容易理解,必然借助于专用工具与代码来管理。但即使计算机与网络能力强悍如斯,二进制文件与网络上的字节流仍然必不可少,不可替代。

标签:

最新
  • 当前简讯:Python工具箱系列(三十七)

    python比较擅长与文本相关的操作。但现实世界中,对于非文本消息的处理

  • 世界快报:2023告五人长沙演唱会最新消息(更新中)

    更新时间:2023年6月25日告五人长沙演唱会将于8月26日在湖南国际会展中

  • 【共探高质量发展新脉动】砥砺前行:促进海洋经济高质量发展 最新消息

    【共探高质量发展新脉动】砥砺前行:促进海洋经济高质量发展,脉动,海底

  • 速递!2023深圳好的整形美容医院排名

    优越的生活是人们都在追求的,没有人愿意甘心平凡,在普通生活里,只有

  • 世界观察:茶叶市场投资前景调研 2023茶叶行业市场现状分析

    茶由散装茶叶产品及其他茶产品组成,包括预制瓶装茶产品及新鲜茶饮。人

  • https://xinshangmeng.com新商盟(gz xinshangmeng)-环球观点

    1、网页打不开,某些页面及软件显示异常一般是由于如下几点原因导致的

  • 观热点:改装修合同注意事项 家庭装修合同签订关键条款有哪些?

    签约人信息双方当事人的信息包括:姓名、联系电话、联系地址等相关

  • 樱桃机械键盘什么轴好(机械键盘什么轴好)-全球要闻

    来为大家解答以上问题,樱桃机械键盘什么轴好,机械键盘什么轴好很多人

  • 胃窦粘膜慢性炎是什么(慢性胃窦炎的症状有哪些?)

    慢性胃窦炎的症状有哪些?胃窦炎的症状是什么1胃窦炎的症状多数慢性非萎

  • 衣服xxl是多大尺码_衣服尺码xxl是多大的个

    1、衣服尺码xxl是180cm的个子。2、根据我国衣服尺码标准,07码表示代码

  • 信心不足,表现非常差劲

    眼看着过节了,这个市场居然以这样一种方式,这是个什么节?端午节又名

  • 高温下各行各业坚守依旧 各地多措并举做好防暑降温

    消息:6月21日是夏至,北方多地可以说是“热”情洋溢。京津冀、山东、

  • 心脏供血不足怎么调理小妙招_心脏供血不足怎么调理

    1、你好。2、心肌供血不足,主要因为冠状动脉硬化或有纤维蛋白、胆固醇

  • 这个行业急缺人!人才给开42万年薪!北上深密集出台支持政策 企业招聘直接要求掌握……

    据央视财经6月21日报道,自去年年底,以生成式AI为代表的应用浪潮开始

  • 每日动态!天文学家利用新技术发现围绕两颗恒星运行的行星

    一个国际天文学家团队首次应用新技术发现了一种绕两颗恒星运行的新型行

  • 16k和32k纸是多大尺寸(16k纸尺寸是多少厘米)

    1、我们使用的全张纸有大度和正度(也称大规和标规)。2、把它裁成16K

  • 旅游
    • 观速讯丨汉商集团(600774)6月16日主力资金净买入186.15万元

    • 肥东白龙镇:宣传安全生产 提升安全意识

    • 爱上亚运 味美浙江 缤纷西博 第二十三届中国(杭州)美食节即将启幕_天天速看

    • 世界动态:(聚焦海峡论坛)两岸特色乡镇交流对接:共享乡村振兴发展机遇和经验