write()
和os.write()
有什麼區別?
它類似於C函數fwrite(3)
和write(2)
之間的差異。
後者是OS級system call的一個簡單封裝,而前者是標準C庫的一部分,該庫會執行一些額外的緩衝操作,最後在需要將其緩衝數據寫入file descriptor。
的Python 3.x的增加了一些附加的邏輯到file
對象的write()
方法,該方法不用於Python str
對象自動字符編碼的轉換,而Python的2 x不。
或者僅僅是由於我手動將字符串轉換爲UTF-8而導致返回值的差異?
在Python 3.x中,差異與您打開文件的方式更相關。
如果以二進制模式打開文件,例如f = open(filename, 'wb')
然後f.write()
預計一個bytes
對象,並將返回字節寫入的數量。
如果您以文本模式打開文件,例如, f = open(filename, 'w')
然後f.write()
需要一個str
對象,並且將返回寫入的個字符的數字,這對於多字節編碼(例如UTF-8)可能與寫入的字節數不匹配。
注意,os.write()
方法總是需要一個bytes
對象,而不管是否將O_BINARY
標誌的主叫os.open()
當使用。
來源
2016-06-28 19:33:47
Aya
如果你在Windows上,並且正在以文本模式寫入文件,那麼將爲每一行結尾寫入兩個字節(cr + lf),其中原始字符串只有一行。如果在這種情況下'file.write()'不能正確地計算字節數,我會考慮這個錯誤,但是無論如何,通過確保文件以''wb''模式打開可以解決問題。 – kindall
有關* text *文件的其他類似觀點:由'tell'返回的值不是**文件中的字節索引,也不是字符索引。這只是一個「尋求」可以用來回到那個位置的數字,但你不應該做太多的事情。 – Bakuriu