60

我在 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”模式,但在文档中发现了它的提及。

EOFError如果我使用"rb"模式,我会在 Linux 上使用,如果使用,我会在 Windows上"r"使用。我只是试"r+b"了一下模式,它在两者上都有效。

什么"r+b"模式?“rb”和“r+b”有什么区别?为什么当其他人不工作时它会起作用?

4

4 回答 4

96

r+用于读取和写入模式。b用于二进制。 r+b模式是以读或写模式打开二进制文件。你可以在这里
阅读更多。

于 2013-04-01T16:08:19.487 回答
27

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

这在文档中有详细说明:

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

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

于 2013-04-01T16:08:52.710 回答
9

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

于 2013-04-01T16:08:47.723 回答
4

在 Windows 上,附加到模式的 'b' 以二进制模式打开文件,因此还有 'rb'、'wb' 和 'r+b' 等模式。Windows 上的 Python 区分了文本文件和二进制文件;读取或写入数据时,文本文件中的行尾字符会自动稍作更改。这种对文件数据的幕后修改适用于 ASCII 文本文件,但它会破坏 JPEG 或 EXE 文件中的二进制数据。在读写此类文件时要非常小心使用二进制模式。在 Unix 上,将“b”附加到模式并没有什么坏处,因此您可以独立于平台使用它来处理所有二进制文件。

来源:读写文件

于 2017-04-12T11:02:53.173 回答