使用文本 I/O 時,似乎忽略了內(nèi)置 open() 函數(shù)的緩沖參數(shù):文本輸入/輸出:>>> f = open("myfile_text.txt", "w",buffering=2)>>> f.write('1')1>>> f.write('1')1>>> f.write('1')1mymachine:~ myuser$ cat myfile.txt ; echomymachine:~ myuser$二進制輸入/輸出:>>> f = open("myfile_binary.txt", "wb",buffering=2)>>> f.write('1'.encode())1>>> f.write('1'.encode())1>>> f.write('1'.encode())1mymachine:~ myuser$ cat myfile.txt ; echo11mymachine:~ myuser$為什么?這是預期的行為嗎?
1 回答

慕容森
TA貢獻1853條經(jīng)驗 獲得超18個贊
我摸索了一下。事實上,文檔指出:
buffering是一個可選整數(shù),用于設置緩沖策略。傳遞 0 以關閉緩沖(僅在二進制模式下允許),1 以選擇行緩沖(僅可用于文本模式),以及一個大于 1 的整數(shù)以指示固定大小塊緩沖區(qū)的大小(以字節(jié)為單位)...
因此,期望指定buffering=2
會導致2B
使用大小的緩沖區(qū)是合理的(并在使用該緩沖區(qū)時看到文件被刷新)。然而,在文本模式下,它似乎(和文檔并沒有真正清楚地表明,在這個地方)影響的下劃線BufferedWriter
,但TextIOWrapper
它的write()
你最終調(diào)用確實還“自己的事” ......與Python 3.7開始,你告訴它不要并讓它通過調(diào)用f.reconfigure(write_through=True)
您打開的文件立即將寫入傳遞給底層對象。
實際上,所有代碼和檢查值write_through
都已經(jīng)在 Python 3.6 中(我已經(jīng)檢查過 3.6.8)(事實上_io_TextIOWrapper_write_impl
,即_io.TextIOWrapper.write
,在兩個版本中都是相同的),但該write_through
屬性尚未公開(尚未公開)。
添加回答
舉報
0/150
提交
取消