2013-04-01 222 views
29

我使用鹹菜模塊在Python和嘗試不同的文件IO模式:是什麼文件RB和R + B模式之間的差異對象

# works on windows.. "rb" 
with open(pickle_f, 'rb') as fhand: 
     obj = pickle.load(fhand) 

# works on linux.. "r" 
with open(pickle_f, 'r') as fhand: 
     obj = pickle.load(fhand) 

# works on both "r+b" 
with open(pickle_f, 'r+b') as fhand: 
     obj = pickle.load(fhand) 

我從來沒有讀過關於「R + B」模式的任何地方,但發現在documentation中提到它。

如果我使用"rb"模式,則在Linux上獲得EOFError,如果使用"r",則在Windows上。我只是給了"r+b"模式一個鏡頭,它對兩者都有效。

什麼是"r+b"模式? 「rb」和「r + b」有什麼區別?當其他人不這樣做時,它爲什麼會起作用?

+0

的可能的複製[蟒打開內置函數:模式之間差A,A +,W,W +,和r +](http://stackoverflow.com/questions/1466000/python-open-in-function-difference-between-modes-aaww-and-r) – kay

回答

50

r+用於閱讀和書寫模式。 b是二進制的。 r+b模式以讀取或寫入模式打開二進制文件。
您可以閱讀更多here

+0

那麼爲什麼它的工作原理? – Iamcool

+1

請閱讀下面的內容:http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files它會回答你的問題 – karthikr

+0

如果我授予文件obj的寫權限,這會導致未來的安全問題嗎? – Iamcool

5

我的理解是,添加r+可以讀取和寫入(就像w+一樣,儘管正如註釋中指出的那樣,將會截斷文件)。 b只是以二進制模式打開它,它應該不太瞭解像分隔符(至少在C++中)。

+4

如果我沒有弄錯,「w +」會刪除文件,如果文件存在,然後打開它進行讀取和寫入。它與「r +」不一樣。 –

+0

這是一個好點,值得一提 - 謝謝! –

12

r開放閱讀,而r+開放閱讀和寫作。 b用於二進制。

這在documentation闡明:

的模式最常用的值是附加'r'閱讀,'w'寫(截斷如果它已經存在的文件),'a'(其在某些Unix系統上,意味着無論當前的查找位置如何,所有寫操作都會追加到文件末尾)。如果省略模式,則默認爲'r'。默認情況下,使用文本模式,該模式可能會將'\n'字符轉換爲寫入時的平臺特定表示並返回讀取。因此,在打開二進制文件時,應該在模式值後附加'b'以二進制模式打開文件,這將提高可移植性。 (添加'b'即使在系統不處理二進制和文本文件的地方也是有用的,它可以作爲文檔。)請參閱下面的模式的更多可能值。

模式'r+','w+''a+'打開文件進行更新(請注意'w+'截斷文件)。將'b'添加到以二進制模式打開文件的模式下,在區分二進制和文本文件的系統上;在沒有這種區別的系統上,添加'b'不起作用。

+0

所以,你的意思是,'r + b'在Linux上不會有任何區別,但在Windows上是有用的。另外,「rb」和「r + b」有什麼區別? – Iamcool

+1

我不確定你看過這個答案仔細,@Iamcool。它回答你所有的問題。 –

2

在Windows中, 'B' 附加到模式以二進制方式打開文件,所以 也有模式,如 'RB', 'WB' 和 'R + B'。 Windows上的Python 區分了文本和二進制文件;在讀取或寫入數據 時,文本文件末尾的 字符會稍微自動更改。這種對文件數據 的後臺修改對於ASCII文本文件來說很好,但它會破壞JPEG或EXE文件中的 這樣的二進制數據。當讀取 並編寫這些文件時,請非常小心地使用二進制模式。在Unix上,將模式追加'b'並不會傷害到該模式,因此您可以在所有二進制 文件中獨立使用它。

來源:Reading and Writing Files

相關問題