Python file operations

Python uses stdio’s fopen function and passes the mode as argument. I am assuming you use windows, since @Lev says the code works fine on Linux.

The following is from the fopen documentation of windows, this may be a clue to solving your problem:

When the “r+”, “w+”, or “a+” access type is specified, both reading
and writing are allowed (the file is said to be open for “update”).
However, when you switch between reading and writing, there must be an
intervening fflush, fsetpos, fseek, or rewind operation. The current
position can be specified for the fsetpos or fseek operation, if
desired.

So, the solution is to add file.seek() before the file.write() call. For appending to the end of the file, use file.seek(0, 2).

For your reference, file.seek works as follows:

To change the file object’s position, use f.seek(offset, from_what).
The position is computed from adding offset to a reference point; the
reference point is selected by the from_what argument. A from_what
value of 0 measures from the beginning of the file, 1 uses the current
file position, and 2 uses the end of the file as the reference point.
from_what can be omitted and defaults to 0, using the beginning of the
file as the reference point.

[reference: http://docs.python.org/tutorial/inputoutput.html]

As mentioned by @lvc in the comments and @Burkhan in his answer, you can use the newer open function from the io module. However, I want to point out that the write function does not work exactly the same in this case — you need to provide unicode strings as input [Simply prefix a u to the string in your case]:

from io import open
fil = open('text.txt', 'a+')
fil.write('abc') # This fails
fil.write(u'abc') # This works

Finally, please avoid using the name ‘file’ as a variable name, since it refers to a builtin type and will be silently over-written, leading to some hard to spot errors.

Leave a Comment