每日熱訊!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)股價快速拉升 最新資訊
- 迅速行動 民勤縣多部門聯合開展燃氣安全專項檢查 世界視訊