久久人妻av一区二区软件 ,欧美日韩中文亚洲另类春色,国产欧美亚洲精品a,亚洲a∨无码男人的天堂,精品亚洲人伦一区二区三区,国产美女精品一区二区,欧美精品aaa久久久影院,成人精品天堂一区二区三区
首頁 資訊 > 洞察 > 正文

每日熱訊!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,顯示效果如下圖所示:

從圖中可以看出,二進制文件確實節省空間,但人類不容易理解,必然借助于專用工具與代碼來管理。但即使計算機與網絡能力強悍如斯,二進制文件與網絡上的字節流仍然必不可少,不可替代。

關鍵詞:

最近更新

關于本站 管理團隊 版權申明 網站地圖 聯系合作 招聘信息

Copyright © 2005-2023 創投網 - www.bbcnxku.cn All rights reserved
聯系我們:39 60 29 14 2@qq.com
皖ICP備2022009963號-3

主站蜘蛛池模板: 亚洲欧美日韩在线观看一区二区三区| 东京热无码一区二区三区av| 亚洲欧美不卡高清在线| 国产成人不卡无码免费视频| 182tv午夜福利在线地址二| 欧美成人h亚洲综合在线观看| 国产精品无码a∨麻豆| 久久国国产免费999| 亚洲欧美在线人成最新 | 久久久av波多野一区二区| 俄罗斯美女真人性做爰| 亚洲成aⅴ人在线观看| 69国产精品久久久久久人妻| 欧美日韩在大午夜爽爽影院| 无码夜色一区二区三区| 亚洲精品久久片久久久久| 正在播放国产对白孕妇作爱| 国产精品福利视频萌白酱| 四虎国产精品一区二区| 亚洲精品第一国产综合麻豆| 美乳丰满人妻无码视频| 99精品全国免费观看视频| 国产精品亚洲а∨天堂123| 亚洲国色天香卡2卡3卡4| 欧美性白人极品hd| 久久www免费人成一看片| 3d全彩无码啪啪本子全彩| 亚洲图片综合图区20p| 狠狠色成人综合网| 久久精品一区二区av999| 一本大道大臿蕉无码视频| 国产毛片女人高潮叫声| 欧美国产日本高清不卡| 国产精品亚洲精品日韩动图| 免费国产黄网站在线观看动图| 无码全黄毛片免费看| 婷婷六月在线精品免费视频观看| 少妇厨房愉情理伦片bd在线观看| 日韩、欧美、亚洲综合在线| 免费无码一区二区三区a片18 | 无套熟女av呻吟在线观看|