文件对象中的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模式有啥区别的主要内容,如果未能解决你的问题,请参考以下文章
C语言中文件打开模式(r/w/a/r+/w+/a+/rb/wb/ab/rb+/wb+/ab+)浅析