51

I have try r+ and a+ to open file and read and write, but 'r+' and 'a+' are all append the str to the end of the file.

So, what's the difference between r+ and a+ ?


Add:

I have found the reason:

I have read the file object and forgot to seek(0) to set the location to the begin

1

3 Answers 3

84

Python opens files almost in the same way as in C:

  • r+ Open for reading and writing. The stream is positioned at the beginning of the file.

  • a+ Open for reading and appending (writing at end of file). The file is created if it does not exist. The initial file position for reading is at the beginning of the file, but output is appended to the end of the file (but in some Unix systems regardless of the current seek position).

Sign up to request clarification or add additional context in comments.

5 Comments

The official documentation implies that the "forget seek" behavior is actually not guaranteed (it works with "some" Unixes): docs.python.org/2/library/functions.html#open. So, a+ does not exactly work in the same way as in C.
I would suggest that you edit the answer to reflect both the fact that the modes do not work exactly in the same way as in C, and the fact that the output is not necessarily appended to the end of the file (albeit it is when no seek is done).
@EOL Well, I must agree here, but still I'm not sure that fopen that implies the pythonic function do not have the same behavior in some Unixes. However, since open function have additional modes (U, rU) we can add "almost" to the answer.
@EOL Doesn't Python rely on system's C libraries for this? I would assume same behavior.
@JanneKarila: Good question. :) I would indeed guess that CPython does rely on the system's C libraries. I am not sure about other Python implementations, though (Jython, PyPy,…).
8

One difference is for r+ if the files does not exist, it'll not be created and open fails. But in case of a+ the file will be created if it does not exist.

Comments

7

If you have used them in C, then they are almost same as were in C.

From the manpage of fopen() function:

  • r+ : - Open for reading and writing. The stream is positioned at the beginning of the file.

  • a+ : - Open for reading and writing. The file is created if it does not exist. The stream is positioned at the end of the file. Subsequent writes to the file will always end up at the then current end of file, irrespective of any intervening fseek(3) or similar.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.