2013-04-01 248 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

相关问题