2016-06-28 78 views
3

我想創建一個包含多個「頁面」的文本文件,並將每個頁面的字節偏移量記錄在一個單獨的文件中。爲此,我將字符串打印到主輸出文件並使用bytes_written += file.write(str)計算字節數。但是,字節偏移通常是錯誤的。Python 3:寫入方法vs os.write返回的字節數

我切換到bytes_written += os.write(fd, bytes(str, 'UTF-8')),它現在可以工作。 write()os.write()有什麼區別?或者僅僅是由於我手動將字符串轉換爲UTF-8而導致返回值的差異?

+0

如果你在Windows上,並且正在以文本模式寫入文件,那麼將爲每一行結尾寫入兩個字節(cr + lf),其中原始字符串只有一行。如果在這種情況下'file.write()'不能正確地計算字節數,我會考慮這個錯誤,但是無論如何,通過確保文件以''wb''模式打開可以解決問題。 – kindall

+0

有關* text *文件的其他類似觀點:由'tell'返回的值不是**文件中的字節索引,也不是字符索引。這只是一個「尋求」可以用來回到那個位置的數字,但你不應該做太多的事情。 – Bakuriu

回答

3

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()當使用。