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

时间:2013-04-01 16:06:48

标签: python file file-io pickle

我在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”模式,但在documentation中发现了这一点。

如果我使用EOFError模式,我在Linux上获得"rb";如果使用"r",则在Windows上获得"r+b"。我只是给了"r+b"模式一个镜头,它正在两者上工作。

什么是{{1}}模式? “rb”和“r + b”之间有什么区别?当其他人不这样做时,为什么会这样?

4 个答案:

答案 0 :(得分:58)

r+用于读取和写入模式。 b用于二进制。 r+b模式以读或写模式打开二进制文件 您可以阅读更多here

答案 1 :(得分:17)

r会打开阅读,而r+会打开阅读和写作。 b用于二进制。

这是在documentation

中详细说明的
  

最常用的模式值是'r'用于读取,'w'用于写入(截断文件,如果它已经存在),'a'用于追加(在某些Unix上)系统意味着所有写入都附加到文件的末尾,而不管当前的搜索位置如何)。如果省略mode,则默认为'r'。默认设置是使用文本模式,该模式可以在写入时将'\n'个字符转换为特定于平台的表示,并在读取时返回。因此,在打开二进制文件时,您应该将'b'附加到模式值以在二进制模式下打开文件,这将提高可移植性。 (即使在不以不同方式处理二进制文件和文本文件的系统上,附加'b'也很有用,它可用作文档。)有关模式的更多可能值,请参见下文。

     

模式'r+''w+''a+'打开文件进行更新(请注意'w+'截断文件)。将'b'附加到模式以在二进制模式下打开文件,在区分二进制文件和文本文件的系统上;在没有这种区别的系统上,添加'b'无效。

答案 2 :(得分:6)

我的理解是为读取和写入添加r+(就像w+一样,尽管如注释中所指出的那样,将截断文件)。 b只是以二进制模式打开它,它应该不太了解行分隔符(至少在C ++中)。

答案 3 :(得分:2)

  

在Windows上,' b'附加到模式后以二进制模式打开文件,所以   还有像' rb',' wb'和' r + b'等模式。 Windows上的Python   区分文本和二进制文件;行尾   文本文件中的字符会在数据时自动更改   被读或写。这种对文件数据的幕后修改   适用于ASCII文本文件,但它会破坏这样的二进制数据   在JPEG或EXE文件中。阅读时要非常小心使用二进制模式   并写这样的文件。在Unix上,附加一个' b'至   模式,所以你可以平台独立使用它为所有二进制文件   文件。

来源:Reading and Writing Files