每日熱訊!Python工具箱系列(三十七)
二進(jìn)制文件操作(上)
python比較擅長(zhǎng)與文本相關(guān)的操作。但現(xiàn)實(shí)世界中,對(duì)于非文本消息的處理也很普遍。例如:
◆通過有線、無(wú)線傳遞傳感器獲得的測(cè)量數(shù)據(jù)。
(資料圖)
◆衛(wèi)星通過電磁波發(fā)送測(cè)量數(shù)據(jù)。
◆數(shù)據(jù)中心的數(shù)萬(wàn)臺(tái)服務(wù)器發(fā)送當(dāng)前CPU的占用率信息、內(nèi)存占用量等眾多指標(biāo)數(shù)據(jù)。
以上數(shù)據(jù),當(dāng)然可以以文本方式發(fā)送,但是對(duì)于帶寬的占用驚人。假設(shè)某個(gè)對(duì)于PM2.5進(jìn)行測(cè)量的傳感器,每隔一秒發(fā)送一次測(cè)量數(shù)據(jù),以文本方式發(fā)送消息,內(nèi)容如下:
"counter: 1, pm25: 170.24119426834042, timestamp: 2022-07-24 08:52:11.138894+00:00"
以上消息占用了81個(gè)字節(jié)。而如果能夠按照約定的格式直接發(fā)送二進(jìn)制數(shù)據(jù),則只需要20個(gè)字節(jié),可以大幅提升傳輸效率。此外,以文本方式在本地保存?zhèn)鞲衅鲾?shù)據(jù),則一天就需要81*86400/1024=6834M字節(jié),對(duì)于傳感器這種體積小巧的嵌入式系統(tǒng),存儲(chǔ)空間極為有限,很快就會(huì)空間耗盡。因此,對(duì)非文本數(shù)據(jù)直接保存與讀取非常有必要。下面的代碼演示了傳感器類,以及傳感器測(cè)量數(shù)據(jù)的二進(jìn)制文件存儲(chǔ)與讀取的基本操作。
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: """ 計(jì)數(shù)器 Returns: int: 從0開始的計(jì)數(shù)器 """ return self._counter @counter.setter def counter(self, value: int): self._counter = value @property def pm25(self) -> float: """ PM25測(cè)量值 Returns: float: pm25的當(dāng)前測(cè)量值 """ return self._pm25 @pm25.setter def pm25(self, value: float): self._pm25 = value @property def timestamp(self) -> datetime: """ 當(dāng)前時(shí)點(diǎn) Returns: datetime: 當(dāng)前的時(shí)間 """ return self._timestamp.datetime def __str__(self): """ 以文字輸出相關(guān)內(nèi)容 Returns: string: 說明性文字 """ return f"counter: {self.counter}, pm25: {self.pm25}, timestamp: {self.timestamp}" def __repr__(self): """ 輸出字節(jié)流的16進(jìn)制內(nèi)容 Returns: string: 16進(jìn)制顯示相關(guān)數(shù)值 """ return str(binascii.hexlify(self.toBytes())) def toBytes(self): """ 將相關(guān)數(shù)據(jù)轉(zhuǎn)換成為bytes,便于網(wǎng)絡(luò)傳輸或者寫入文件 Returns: bytes: 整合測(cè)量數(shù)據(jù)到字節(jié)流中 """ with BytesIO() as byio: byio.write(struct.pack("其中arrow是非常值得推薦的時(shí)間處理框架。python有內(nèi)置的時(shí)間處理框架,功能非常完善,但失之于亂與雜,掌握起來非常不易。而arrow則非常人性化,做到了拿來即用。其安裝過程非常簡(jiǎn)單,直接pip install arrow即可。在示例程序中,為了能夠方便存儲(chǔ),我們將時(shí)間戳直接用UNIX的timestamp來表示,轉(zhuǎn)換后為了保持精度,本例使用double(8字節(jié))存儲(chǔ),如果要求不高,可以改為float(4字節(jié))。
sensordata_v1類使用@property裝飾器來定義屬性。總共有3個(gè)屬性:
◆counter-計(jì)數(shù)器。從0開始計(jì)數(shù)累加,后續(xù)保存到數(shù)據(jù)庫(kù)中時(shí)也方便檢索。
◆pm25-PM2.5測(cè)量值。在示例代碼中使用random.uniform模擬一個(gè)0到300的隨機(jī)浮點(diǎn)值,沒有什么太大的意義,保證每次不同即可。
◆timestamp-數(shù)據(jù)采集時(shí)的對(duì)應(yīng)時(shí)間。
str類函數(shù)
可以自定義,本例中用它來直觀的表示當(dāng)前的采集值。當(dāng)對(duì)sensordata_v1類的實(shí)例打印時(shí),就會(huì)自動(dòng)調(diào)用這個(gè)函數(shù)。
repr類函數(shù)
可以自定義,本例中用它來演示轉(zhuǎn)換成為字節(jié)流bytes時(shí)的16進(jìn)制值。對(duì)于程序員來說,16進(jìn)制來表示字節(jié)是比較自然的。
toBytes類函數(shù)具體展示了如何將類的屬性值轉(zhuǎn)換成為二進(jìn)制字節(jié)流,主要依靠python內(nèi)置的struct模塊。在內(nèi)存中模擬文件打開一個(gè)BytesIO,并且依次寫入struct.pack編碼后的字節(jié)流,最終統(tǒng)一輸出。
fromBytes類函數(shù)具體展示了如何從字節(jié)流反解成為對(duì)象的屬性值。struct.pack與struct.unpack成對(duì)出現(xiàn)。
toFile函數(shù)將編碼好的字節(jié)流寫入二進(jìn)制文件。寫入的模式為"wb",其中w代表全覆蓋寫入的意思,b代表二進(jìn)制模式的意思。fromFile負(fù)責(zé)從二進(jìn)制文件讀回保存的字節(jié)流,重新生成各個(gè)sensordata_v1對(duì)象。
生成的二進(jìn)制文件,可以使用UltraEditor、InHex等。也可以直接使用vscode自帶的2進(jìn)制文件瀏覽器擴(kuò)展Hex Editor,顯示效果如下圖所示:
從圖中可以看出,二進(jìn)制文件確實(shí)節(jié)省空間,但人類不容易理解,必然借助于專用工具與代碼來管理。但即使計(jì)算機(jī)與網(wǎng)絡(luò)能力強(qiáng)悍如斯,二進(jìn)制文件與網(wǎng)絡(luò)上的字節(jié)流仍然必不可少,不可替代。
關(guān)鍵詞:
您可能也感興趣:
今日熱點(diǎn)
為您推薦
歐洲央行副行長(zhǎng)稱正進(jìn)入加息周期最后階段
足協(xié)杯第三輪黑龍江冰城對(duì)陣南通支云比賽即將打響 環(huán)球播資訊
全球熱消息:攜程網(wǎng)客服電話人工服務(wù)電話多少_攜程網(wǎng)客服
更多
- 全球報(bào)道:項(xiàng)目經(jīng)理告訴你,項(xiàng)目管理的基本原則
- 十大券商看后市:A股短期或有所波動(dòng) 流動(dòng)性仍對(duì)市場(chǎng)有支撐_...
- 迅速行動(dòng) 民勤縣多部門聯(lián)合開展燃?xì)獍踩珜m?xiàng)檢查 世界視訊
- 全球觀點(diǎn):2023年江蘇高考分?jǐn)?shù)線公布:本科歷史類474分、物理...
- 今日觀點(diǎn)!中央紀(jì)委國(guó)家監(jiān)委宣傳部副部長(zhǎng)、一級(jí)巡視員郝宗強(qiáng)接...
- 2023智能家電行業(yè)發(fā)展趨勢(shì)及智能家電行業(yè)發(fā)展現(xiàn)狀分析
- 長(zhǎng)沙郵局海關(guān)查獲“異寵”甲蟲14只|環(huán)球信息
- 25日起,遷安這些公交線路有調(diào)整
排行
- 環(huán)球速看:房子住久了,就有“居住權(quán)”嗎?
- 我國(guó)穩(wěn)居世界第一制造業(yè)大國(guó)地位,高質(zhì)量發(fā)展邁上新臺(tái)階
- 新一線城市中13城GDP超萬(wàn)億元 哪座城市更有沖勁?
- 房地產(chǎn)企業(yè)經(jīng)營(yíng)業(yè)績(jī)良好 為何地產(chǎn)股價(jià)“跌跌不休”?
- 新老人:消費(fèi)觀感性與理性并存,購(gòu)物從“老三場(chǎng)”轉(zhuǎn)移到“新...
- 中國(guó)奧園榮登福布斯全球2000強(qiáng)第849位 大幅躍升303位
- 數(shù)字化改革背景下,杭州以“產(chǎn)業(yè)大腦”賦能城市產(chǎn)業(yè)治理
- 江西將實(shí)現(xiàn)從“以票管稅”向“以數(shù)治稅”分類精準(zhǔn)監(jiān)管轉(zhuǎn)變
- 7月份規(guī)模以上工業(yè)增加值增長(zhǎng)6.4%,前7月增長(zhǎng)14.4%
- 疫情常態(tài)化大背景下,各地該如何發(fā)展旅游業(yè)?
最近更新
- 每日熱訊!Python工具箱系列(三十七)
- 人民網(wǎng)評(píng):嚴(yán)守耕地紅線,端牢中國(guó)飯碗
- 年賺17億的燕之屋,上市又懸了!
- 世界最資訊丨完全沒有想到周潤(rùn)發(fā)新片會(huì)是這樣一部“賭片”,...
- 內(nèi)蒙古一地發(fā)生重大刑案,警方發(fā)布協(xié)查通報(bào)!
- 高招直播間里有“高招” 每日快看
- 天天新資訊:中暑都有哪些癥狀?如何防范中暑?專家解答→
- 中外“箭客”齊聚青海尖扎上演“百步穿楊”好戲
- 環(huán)球視訊!內(nèi)蒙古納林陶亥鎮(zhèn):發(fā)展集體經(jīng)濟(jì) 助推強(qiáng)村富民
- 金銀花開出“金色”致富路 熱門看點(diǎn)
- 焦點(diǎn)速看:敲詐勒索40余次,在校大學(xué)生被刑拘……
- 今日關(guān)注:一文讀懂 CuNi23Mn 是什么?
- 天天關(guān)注:搖滾樂中的愛與和平 | 這些歌曲每一位樂迷都應(yīng)該聽
- 銀河電子:南京證券股份有限公司投資者于6月21日調(diào)研我司
- 環(huán)球微資訊!這里應(yīng)成為培養(yǎng)現(xiàn)代文學(xué)創(chuàng)作者的搖籃,“上海大...
- 【全國(guó)文明城市創(chuàng)建進(jìn)行時(shí)】茌平:全面整治路域環(huán)境 打造和...
- 拍照翻譯軟件哪個(gè)好?一分鐘幫你搞定|每日視訊
- 方盛制藥:藤黃健骨片擬中選全國(guó)中成藥采購(gòu)聯(lián)盟集采|全球最資訊
- 安徽挖出大清官包拯墓,出土金絲楠木棺槨,專家:我們被古人騙了
- 天天要聞:一場(chǎng)電影首映活動(dòng),讓80歲老人找到失散20年老戰(zhàn)友...
- 每日時(shí)訊!新三板(含北交所)周報(bào):專精特新企業(yè)扎堆沖刺新三板...
- 世界今熱點(diǎn):司法部:準(zhǔn)予5家外國(guó)律師事務(wù)所在華設(shè)立代表處
- 牂牁江大橋主纜牽引順利完成_世界新要聞
- 每日信息:在哪做醫(yī)療事故鑒定
- 中國(guó)駐美國(guó)大使謝鋒與華盛頓地區(qū)部分僑界代表座談交流
- 沙面街道創(chuàng)新“微改造”,便民服務(wù)“大提升”_當(dāng)前簡(jiǎn)訊
- 迅速行動(dòng) 民勤縣多部門聯(lián)合開展燃?xì)獍踩珜m?xiàng)檢查 世界視訊
- 小倉(cāng)康敬:《裝甲核心6》戰(zhàn)斗系統(tǒng)有趣、可玩-世界百事通
- 世界觀天下!3男子深夜"炸街"玩刺激,南京江寧警方重拳出擊整治
- 賽博朋克2077:DLC《往日之影》主機(jī)版畫面性能評(píng)測(cè)-世界通訊
今日要聞
- 銀河電子:南京證券股份有限公司投資者于6月21日調(diào)研我司
- 全球報(bào)道:項(xiàng)目經(jīng)理告訴你,項(xiàng)目管理的基本原則
- 觀點(diǎn)丨 “廬山真面目”不該是“門票套路” 環(huán)球微頭條
- 世界快訊:今年全國(guó)快遞業(yè)務(wù)量已達(dá)600億件
- 每日熱訊!Python工具箱系列(三十七)
- 理想城市NOA能力如何?博主第一視角實(shí)測(cè):鄉(xiāng)間小路都能走
- 十大券商看后市:A股短期或有所波動(dòng) 流動(dòng)性仍對(duì)市場(chǎng)有支撐_世界快資訊
- 環(huán)球焦點(diǎn)!今日熱門!今日?qǐng)?bào)丨每日視訊:每日消息!世界觀點(diǎn):莫信天上掉餡餅 守住您的錢袋子--建行石嘴山分行走進(jìn)政務(wù)大廳開展金融知識(shí)教育活動(dòng) 焦點(diǎn)播報(bào)|當(dāng)前滾動(dòng)
- 6月26日 11:19分 金剛光伏(300093)股價(jià)快速拉升 最新資訊
- 迅速行動(dòng) 民勤縣多部門聯(lián)合開展燃?xì)獍踩珜m?xiàng)檢查 世界視訊