Python使用open函數(shù)的buffering設(shè)置文件緩沖方式
如何設(shè)置文件的緩沖
實(shí)際案例
將文件內(nèi)容寫到硬件設(shè)備時(shí),使用系統(tǒng)調(diào)用,這類I/O操作的時(shí)間很長。
為了減少I/O操作的次數(shù),文件通常使用緩沖區(qū)。
(有足夠多的數(shù)據(jù)才進(jìn)行系統(tǒng)調(diào)用)文件的緩沖行為,分為全緩沖、行緩沖、無緩沖。
如何設(shè)置python中文件對(duì)象的緩沖行為?
python文件對(duì)象默認(rèn)的緩沖行為4個(gè)字節(jié)(4096)
解決方案
- 全緩沖:open函數(shù)的buffering設(shè)置為大于1的整數(shù)n,n為緩沖區(qū)大小。
- 行緩沖:open函數(shù)的buffering設(shè)置為1 。
- 無緩沖:pen函數(shù)的buffering設(shè)置為0。
注意:
都是在python交互模式下進(jìn)行的操作,如果是用腳本,腳本運(yùn)行完關(guān)閉文件對(duì)象,緩沖區(qū)內(nèi)容就會(huì)寫到磁盤中,這樣就觀察不了緩沖區(qū)不同大小的行為了。
文件緩沖介紹?
對(duì)于磁盤這類的塊設(shè)備,它的讀寫不是一個(gè)字節(jié)一個(gè)字節(jié)完成的,而是按塊每次讀寫一個(gè)塊,假設(shè)一個(gè)塊的大小是4096個(gè)字節(jié),那就意味著寫入一個(gè)字節(jié)和寫入4096個(gè)字節(jié)都需要一次I/O操作,它們的用時(shí)是相同的。
在這種情況為了提高效率就要減少I/O操作的次數(shù),使用的手段就是為文件設(shè)立一個(gè)緩沖區(qū)。
當(dāng)需要寫入的字節(jié)數(shù)不足一個(gè)塊設(shè)備大小的時(shí)候,那么都放入緩沖區(qū)當(dāng)中,湊夠一個(gè)塊的大小才調(diào)用一次系統(tǒng)調(diào)用。
- 全緩沖就是緩沖區(qū)有一定大小滿足那個(gè)數(shù)量就進(jìn)行一次系統(tǒng)調(diào)用;
- 行緩沖就是碰到一個(gè)換行符就進(jìn)行一次輸出也就是一次系統(tǒng)調(diào)用;
- 無緩沖就是不希望有緩沖的實(shí)時(shí)寫入到文件,如串口設(shè)備,需要及時(shí)的發(fā)送到串口上去。
代碼演示
f = open('open.txt', 'wb') ''' 使用tail -f open.txt,實(shí)時(shí)查看文件內(nèi)容, python交互模式下,輸入以下內(nèi)容,查看寫入4096個(gè)字節(jié)前后輸出變化。 ''' f.write(b'abc') f.write(b'+' * 4093) f.write(b'-') ''' 普通文件默認(rèn)的緩沖行為,緩沖區(qū)的大小4096,是根據(jù)平臺(tái)和 塊設(shè)備自身的屬性相關(guān)。在某些情況下想改變緩沖區(qū)的大小應(yīng)該怎么做? 通過open函數(shù)buffering參數(shù)設(shè)置緩沖大小。 ''' # 設(shè)置全緩沖區(qū)的大小為2048 f2 = open('demo2.txt', 'wb', buffering=2048) f2.write(b'+' * 1024) f2.write(b'+' * 1023) f2.write(b'-' * 2) # 設(shè)置行緩沖,buffering為1 f3 = open('demo3.txt', 'wb', buffering=1) f.write(b'abc') f.write(b'123') f.write(b'\n') # 無緩沖,buffering為0 f4 = open('demo4.txt', 'wb', buffering=0) f4.write(b'a') f4.write(b'1234')
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
PyQt5基本控件使用之消息彈出、用戶輸入、文件對(duì)話框的使用方法
本文主要介紹PyQt界面實(shí)現(xiàn)中常用的消息彈出對(duì)話框、提供用戶輸入的輸入框、打開文件獲取文件/目錄路徑的文件對(duì)話框。 本文主要針對(duì)這三種控件的主要場景進(jìn)行介紹。感興趣的朋友跟隨小編一起看看吧2019-08-08Windows下安裝python MySQLdb遇到的問題及解決方法
這篇文章主要介紹了Windows下安裝python MySQLdb遇到的問題及解決方法,需要的朋友可以參考下2017-03-03python print()函數(shù)的end參數(shù)和sep參數(shù)的用法說明
這篇文章主要介紹了python print()函數(shù)的end參數(shù)和sep參數(shù)的用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05Python實(shí)現(xiàn)對(duì)比兩個(gè)Excel數(shù)據(jù)內(nèi)容并標(biāo)記出不同
日常工作中需要對(duì)比兩個(gè)Excel工作表中的數(shù)據(jù)差異是很不方便的,使用python來做就比較簡單了!本文為大家介紹了python實(shí)現(xiàn)對(duì)比兩個(gè)Excel的數(shù)據(jù)內(nèi)容并標(biāo)記出不同數(shù)據(jù)的示例代碼,需要的可以參考一下2022-12-12基于Python實(shí)現(xiàn)主機(jī)遠(yuǎn)程控制
這篇文章主要介紹了基于Python實(shí)現(xiàn)主機(jī)遠(yuǎn)程控制,本文為?HITwh?網(wǎng)絡(luò)空間安全專業(yè)網(wǎng)絡(luò)空間安全設(shè)計(jì)與實(shí)踐選題,主要實(shí)現(xiàn)了遠(yuǎn)程監(jiān)控局域網(wǎng)內(nèi)的主機(jī)桌面與網(wǎng)絡(luò)情況、簡單鍵鼠控制、遠(yuǎn)程斷網(wǎng)(ARP?攻擊)、數(shù)據(jù)加密傳輸?shù)裙δ埽旅鎭砜纯淳唧w實(shí)現(xiàn)過程吧2022-01-01