在Python中打开文件时,“r+”和“a+”有什么区别?

50

我尝试了 r+a+ 用于打开文件并读/写,但是 'r+' 和 'a+' 都是将字符串追加到文件末尾。

那么,r+a+ 有什么区别呢?


补充说明:

我已经找到了原因:

我读取了文件对象却忘记使用 seek(0) 将位置设置为开头了。


https://dev59.com/6nM_5IYBdhLWcg3wPAfT#30931305 - industryworker3595112
3个回答

81

Python以与C语言相同的方式打开文件:

  • r+ 读写模式。文件流定位于文件开头。

  • a+ 读取并追加(在文件末尾写入)。如果文件不存在,则创建该文件。 读取时文件位置在文件开头,但输出会被追加到文件末尾(但在某些Unix系统中不管当前寻址位置如何)。


5
官方文档表明,“遗忘搜索”行为实际上并不保证(它适用于“某些”Unix系统):http://docs.python.org/2/library/functions.html#open。因此, a+ 并不完全像C语言中的方式那样工作。请注意,本文只是翻译,不包含任何解释或额外内容。 - Eric O. Lebigot
我建议您编辑答案以反映模式与C语言中的工作方式并不完全相同,以及输出不一定附加到文件末尾(尽管在没有执行搜索时会这样)。 - Eric O. Lebigot
1
嗯,我必须在这里同意,但我仍然不确定暗示Pythonic函数的fopen某些 Unix中是否具有相同的行为。然而,由于open函数具有附加模式(UrU),我们可以在答案中添加“几乎”。 - VisioN
1
Python 是否依赖于系统的 C 库来实现此功能?我会假设其行为相同。 - Janne Karila
@JanneKarila:好问题。 :) 我确实猜测CPython依赖于系统的C库。不过,我不确定其他Python实现(Jython,PyPy,...)。 - Eric O. Lebigot

8

一个区别是,对于r+,如果文件不存在,则不会被创建并且打开失败。但是对于a+,如果文件不存在,则会创建该文件。


6
如果你在 C 中使用过它们,那么它们几乎与 C 中的相同。
来自 fopen() 函数的 manpage
  • r+:- 读写打开。流定位于文件开头。

  • a+:- 读写打开。如果文件不存在,则创建该文件。流定位于文件末尾。随后对文件的写入将始终结束于当前的文件末尾,而不管任何介于其中的 fseek(3) 或类似函数。

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