每日热讯!Python工具箱系列(三十七)
二进制文件操作(上)
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工具箱系列(三十七)
- 人民网评:严守耕地红线,端牢中国饭碗
- 年赚17亿的燕之屋,上市又悬了!
- 世界最资讯丨完全没有想到周润发新片会是这样一部“赌片”,...
- 内蒙古一地发生重大刑案,警方发布协查通报!
- 高招直播间里有“高招” 每日快看
- 天天新资讯:中暑都有哪些症状?如何防范中暑?专家解答→
- 中外“箭客”齐聚青海尖扎上演“百步穿杨”好戏
- 环球视讯!内蒙古纳林陶亥镇:发展集体经济 助推强村富民
- 金银花开出“金色”致富路 热门看点
- 焦点速看:敲诈勒索40余次,在校大学生被刑拘……
- 今日关注:一文读懂 CuNi23Mn 是什么?
- 天天关注:摇滚乐中的爱与和平 | 这些歌曲每一位乐迷都应该听
- 银河电子:南京证券股份有限公司投资者于6月21日调研我司
- 环球微资讯!这里应成为培养现代文学创作者的摇篮,“上海大...
- 【全国文明城市创建进行时】茌平:全面整治路域环境 打造和...
- 拍照翻译软件哪个好?一分钟帮你搞定|每日视讯
- 方盛制药:藤黄健骨片拟中选全国中成药采购联盟集采|全球最资讯
- 安徽挖出大清官包拯墓,出土金丝楠木棺椁,专家:我们被古人骗了
- 天天要闻:一场电影首映活动,让80岁老人找到失散20年老战友...
- 每日时讯!新三板(含北交所)周报:专精特新企业扎堆冲刺新三板...
- 世界今热点:司法部:准予5家外国律师事务所在华设立代表处
- 牂牁江大桥主缆牵引顺利完成_世界新要闻
- 每日信息:在哪做医疗事故鉴定
- 中国驻美国大使谢锋与华盛顿地区部分侨界代表座谈交流
- 沙面街道创新“微改造”,便民服务“大提升”_当前简讯
- 迅速行动 民勤县多部门联合开展燃气安全专项检查 世界视讯
- 小仓康敬:《装甲核心6》战斗系统有趣、可玩-世界百事通
- 世界观天下!3男子深夜"炸街"玩刺激,南京江宁警方重拳出击整治
- 赛博朋克2077:DLC《往日之影》主机版画面性能评测-世界通讯
今日要闻
- 银河电子:南京证券股份有限公司投资者于6月21日调研我司
- 全球报道:项目经理告诉你,项目管理的基本原则
- 观点丨 “庐山真面目”不该是“门票套路” 环球微头条
- 世界快讯:今年全国快递业务量已达600亿件
- 每日热讯!Python工具箱系列(三十七)
- 理想城市NOA能力如何?博主第一视角实测:乡间小路都能走
- 十大券商看后市:A股短期或有所波动 流动性仍对市场有支撑_世界快资讯
- 环球焦点!今日热门!今日报丨每日视讯:每日消息!世界观点:莫信天上掉馅饼 守住您的钱袋子--建行石嘴山分行走进政务大厅开展金融知识教育活动 焦点播报|当前滚动
- 6月26日 11:19分 金刚光伏(300093)股价快速拉升 最新资讯
- 迅速行动 民勤县多部门联合开展燃气安全专项检查 世界视讯