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

Posted

技术标签:

【中文标题】文件对象中的rb和r+b模式有啥区别【英文标题】:What is the difference between rb and r+b modes in file objects文件对象中的rb和r+b模式有什么区别 【发布时间】:2013-03-22 17:37:53 【问题描述】:

我在 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 中发现了它的提及。

如果我使用"rb" 模式,我会在 Linux 上获得EOFError,如果使用"r",我会在 Windows 上获得。我刚刚试了一下"r+b" 模式,它对这两种模式都有效。

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

【问题讨论】:

python open built-in function: difference between modes a, a+, w, w+, and r+?的可能重复 希望这个answer 会有所帮助,它解释了python3 中'r''rb' 之间的区别。 【参考方案1】:

r+ 用于读写模式。 b 用于二进制。 r+b 模式是以读写模式打开二进制文件。 你可以阅读更多here。

【讨论】:

请阅读:docs.python.org/2/tutorial/…它会回答你的问题 如果我向不需要的文件 obj 授予写入权限,这会导致将来出现任何安全问题吗? 这是有风险的。尤其是在 Windows 中,因为它每次打开文件时都会修改文件【参考方案2】:

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

【讨论】:

如果我没记错的话,“w+”会在文件存在的情况下将其擦除,然后再打开进行读写。它与“r+”不同。【参考方案3】:

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

documentation:

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

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

【讨论】:

所以,你的意思是,r+b 在 Linux 上不会有任何区别,但在 Windows 上会有所不同。此外,“rb”和“r+b”有什么区别.. 我不确定你是否仔细阅读了这个答案,@Iamcool。它回答了你所有的问题。【参考方案4】:

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

来源:Reading and Writing Files

【讨论】:

以上是关于文件对象中的rb和r+b模式有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

r 和 rb 模式下解析文本文件的区别

文件读写’r'和’rb’区别

python基础-文件读写'r' 和 'rb'区别

C语言中文件打开模式(r/w/a/r+/w+/a+/rb/wb/ab/rb+/wb+/ab+)浅析

c语言中,再对文件的操作模式中,a和a+、w和w+、r和r+有啥区别?

文件操作