Python使用open函數(shù)的buffering設(shè)置文件緩沖方式
如何設(shè)置文件的緩沖
實(shí)際案例
將文件內(nèi)容寫(xiě)到硬件設(shè)備時(shí),使用系統(tǒng)調(diào)用,這類(lèi)I/O操作的時(shí)間很長(zhǎng)。
為了減少I(mǎi)/O操作的次數(shù),文件通常使用緩沖區(qū)。
(有足夠多的數(shù)據(jù)才進(jìn)行系統(tǒng)調(diào)用)文件的緩沖行為,分為全緩沖、行緩沖、無(wú)緩沖。
如何設(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 。
- 無(wú)緩沖:pen函數(shù)的buffering設(shè)置為0。
注意:
都是在python交互模式下進(jìn)行的操作,如果是用腳本,腳本運(yùn)行完關(guān)閉文件對(duì)象,緩沖區(qū)內(nèi)容就會(huì)寫(xiě)到磁盤(pán)中,這樣就觀察不了緩沖區(qū)不同大小的行為了。
文件緩沖介紹?
對(duì)于磁盤(pán)這類(lèi)的塊設(shè)備,它的讀寫(xiě)不是一個(gè)字節(jié)一個(gè)字節(jié)完成的,而是按塊每次讀寫(xiě)一個(gè)塊,假設(shè)一個(gè)塊的大小是4096個(gè)字節(jié),那就意味著寫(xiě)入一個(gè)字節(jié)和寫(xiě)入4096個(gè)字節(jié)都需要一次I/O操作,它們的用時(shí)是相同的。
在這種情況為了提高效率就要減少I(mǎi)/O操作的次數(shù),使用的手段就是為文件設(shè)立一個(gè)緩沖區(qū)。
當(dāng)需要寫(xiě)入的字節(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)用;
- 無(wú)緩沖就是不希望有緩沖的實(shí)時(shí)寫(xiě)入到文件,如串口設(shè)備,需要及時(shí)的發(fā)送到串口上去。
代碼演示
f = open('open.txt', 'wb') ''' 使用tail -f open.txt,實(shí)時(shí)查看文件內(nèi)容, python交互模式下,輸入以下內(nèi)容,查看寫(xiě)入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)該怎么做? 通過(guò)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') # 無(wú)緩沖,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)文章
使用Python開(kāi)發(fā)一個(gè)PDF文本提取工具
在日常工作中,我們經(jīng)常需要從PDF文檔中提取文本內(nèi)容,雖然市面上有不少相關(guān)工具,但它們要么功能過(guò)于復(fù)雜,要么使用不夠方便,本文將介紹如何使用Python開(kāi)發(fā)一個(gè)簡(jiǎn)單實(shí)用的PDF文本提取工具,需要的朋友可以參考下2025-02-02PyQt5基本控件使用之消息彈出、用戶輸入、文件對(duì)話框的使用方法
本文主要介紹PyQt界面實(shí)現(xiàn)中常用的消息彈出對(duì)話框、提供用戶輸入的輸入框、打開(kāi)文件獲取文件/目錄路徑的文件對(duì)話框。 本文主要針對(duì)這三種控件的主要場(chǎng)景進(jìn)行介紹。感興趣的朋友跟隨小編一起看看吧2019-08-08Windows下安裝python MySQLdb遇到的問(wèn)題及解決方法
這篇文章主要介紹了Windows下安裝python MySQLdb遇到的問(wèn)題及解決方法,需要的朋友可以參考下2017-03-03python print()函數(shù)的end參數(shù)和sep參數(shù)的用法說(shuō)明
這篇文章主要介紹了python print()函數(shù)的end參數(shù)和sep參數(shù)的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05Python實(shí)現(xiàn)對(duì)比兩個(gè)Excel數(shù)據(jù)內(nèi)容并標(biāo)記出不同
日常工作中需要對(duì)比兩個(gè)Excel工作表中的數(shù)據(jù)差異是很不方便的,使用python來(lái)做就比較簡(jiǎn)單了!本文為大家介紹了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ò)空間安全專(zhuān)業(yè)網(wǎng)絡(luò)空間安全設(shè)計(jì)與實(shí)踐選題,主要實(shí)現(xiàn)了遠(yuǎn)程監(jiān)控局域網(wǎng)內(nèi)的主機(jī)桌面與網(wǎng)絡(luò)情況、簡(jiǎn)單鍵鼠控制、遠(yuǎn)程斷網(wǎng)(ARP?攻擊)、數(shù)據(jù)加密傳輸?shù)裙δ?,下面?lái)看看具體實(shí)現(xiàn)過(guò)程吧2022-01-01