文件对象中的rb模式和r+b模式有什么区别?

65

我正在使用Python中的pickle模块,尝试不同的文件IO模式:

# 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"模式的介绍,但在文档中看到了它的提及。

如果我使用"rb"模式,在Linux上会出现EOFError,如果使用"r"模式,则在Windows上出现。我尝试了一下"r+b"模式,它在两个操作系统上都可以工作。

什么是"r+b"模式? "rb"和"r+b"之间有什么区别?为什么它可以工作而其他模式不行?


1
希望这个答案能够帮到你,它解释了在Python3中'r''rb'之间的区别。 - Yossarian42
4个回答

104

r+用于读取和写入模式,b适用于二进制文件。 r+b模式在读取或写入模式下打开二进制文件。
您可以在此处了解更多信息。


1
请阅读此链接:http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files 它会回答你的问题。 - karthikr
如果我在不必要的情况下授予文件 obj 写权限,这是否会导致未来的任何安全问题? - Iamcool
这很危险,特别是在Windows系统中,因为每次打开文件时都会修改它。 - karthikr

28

r 为只读模式,r+ 为读写模式。 b 用于二进制文件。

这在文档中有详细解释:

最常用的 mode 值是 'r' 表示只读,'w' 表示写入(如果文件已存在,则截断文件),'a' 表示追加写入(在某些 Unix 系统上,这意味着所有写入都将附加到文件末尾,而不管当前的寻位位置如何)。如果省略 mode,则默认为 'r'。默认情况下使用文本模式,在写入时可能会将 '\n' 转换为特定于平台的表示形式,并在读取时将其转换回来。因此,当打开二进制文件时,应将 'b' 添加到 mode 值以二进制模式打开文件,这将提高可移植性。(即使在不区分二进制和文本文件的系统上,添加 'b' 也很有用,它可以作为文档。)请参阅下面了解更多可能的 mode 值。

mode 的值还可以是 'r+''w+''a+',表示以更新模式打开文件(请注意,'w+' 会截断文件)。在区分二进制和文本文件的系统上,将 'b' 添加到 mode 中以二进制模式打开文件;在不区分这两种类型的系统上,添加 'b' 没有影响。


1
所以,你的意思是,在Linux上r+b不会有任何区别,但在Windows上会有区别。此外,“rb”和“r+b”之间有什么区别? - Iamcool
3
我不确定你是否仔细阅读了这个答案,@Iamcool。它回答了你所有的问题。 - Francis Avila

9

我的理解是添加r+既可读又可写(就像w+一样,但正如评论中指出的那样,会截断文件)。b仅仅是以二进制模式打开文件,这种模式应该对诸如行分隔符之类的事物不太敏感(至少在C ++中)。


8
如果我没记错的话,"w+"会在文件存在时将其擦除,然后打开以进行读写操作。这与"r+"不同。 - Omri Barel

4
在Windows上,将“b”附加到模式后会以二进制模式打开文件,因此还有像“rb”,“wb”和“r + b”这样的模式。在Windows上,Python区分文本文件和二进制文件;读取或写入数据时,文本文件中的行尾字符会自动略微更改。对于ASCII文本文件,文件数据的这种幕后修改是可以接受的,但它会破坏像JPEG或EXE文件中的二进制数据。在读取和写入此类文件时一定要非常小心地使用二进制模式。在Unix上,附加“b”到模式后不会有影响,因此您可以将其用于所有二进制文件,实现跨平台使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接