Python使用open函數(shù)的buffering設(shè)置文件緩沖方式
如何設(shè)置文件的緩沖
實(shí)際案例
將文件內(nèi)容寫(xiě)到硬件設(shè)備時(shí),使用系統(tǒng)調(diào)用,這類I/O操作的時(shí)間很長(zhǎng)。
為了減少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ě)到磁盤中,這樣就觀察不了緩沖區(qū)不同大小的行為了。
文件緩沖介紹?
對(duì)于磁盤這類的塊設(shè)備,它的讀寫(xiě)不是一個(gè)字節(jié)一個(gè)字節(jié)完成的,而是按塊每次讀寫(xiě)一個(gè)塊,假設(shè)一個(gè)塊的大小是4096個(gè)字節(jié),那就意味著寫(xiě)入一個(gè)字節(jié)和寫(xiě)入4096個(gè)字節(jié)都需要一次I/O操作,它們的用時(shí)是相同的。
在這種情況為了提高效率就要減少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)文章
解決pandas .to_excel不覆蓋已有sheet的問(wèn)題
今天小編就為大家分享一篇解決pandas .to_excel不覆蓋已有sheet的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
python 地圖經(jīng)緯度轉(zhuǎn)換、糾偏的實(shí)例代碼
這篇文章主要介紹了python 地圖經(jīng)緯度轉(zhuǎn)換、糾偏的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
python使用jieba實(shí)現(xiàn)中文分詞去停用詞方法示例
jieba分詞,完全開(kāi)源,有集成的python庫(kù),簡(jiǎn)單易用。下面這篇文章主要給大家介紹了關(guān)于python使用jieba實(shí)現(xiàn)中文分詞去停用詞的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2018-03-03
使用Python集合顯著優(yōu)化算法性能的實(shí)戰(zhàn)案例
掌握?Python?中的?set?數(shù)據(jù)結(jié)構(gòu),是算法和數(shù)據(jù)結(jié)構(gòu)的基本功,今天我們從一個(gè)實(shí)戰(zhàn)案例出發(fā),探討如何利用Python集合顯著優(yōu)化算法性能,感興趣的同學(xué)跟著小編一起來(lái)探討吧2023-06-06
python 監(jiān)控logcat關(guān)鍵字功能
這篇文章主要介紹了python 監(jiān)控logcat關(guān)鍵字功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09

