In Python, the following statements do not work:
f = open("ftmp", "rw")
print >> f, "python"
I get the error:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 9] Bad file descriptor
But with the following code it works:
g = open("ftmp", "r+")
print >> g, "python"
It looks like I need to revise the file modes. What are the deep intricacies of the file opening modes?
Python file modes. Don’t confuse, read about very mode as below. r for reading – The file pointer is placed at the beginning of the file. This is the default mode. r+ Opens a file for both reading and writing. The file pointer will be at the beginning of the file. w Opens a file for writing only. Overwrites the file if the file exists.
a Mode in Python File Opening The a mode opens the file for the purpose of appending. The file pointer in this mode is placed at the end of the file if it already exists in the system. If the file does not exist, then it is created for writing.
Python file modes. Don’t confuse, read about very mode as below. r for reading – The file pointer is placed at the beginning of the file. This is the default mode. r+ Opens a file for both reading and writing. The file pointer will be at the beginning of the file. w Opens a file for writing only.
We use open () function in Python to open a file in read or write mode. As explained above, open () will return a file object. To return a file object we use open () function along with two arguments, that accepts file name and the mode, whether to read or write. So, the syntax being: open (filename, mode).
Better yet, let the documentation do it for you: http://docs.python.org/library/functions.html#open. Your issue in the question is that there is no "rw" mode... you probably want 'r+' as you wrote (or 'a+' if the file does not yet exist).
As an addition to @Jarret Hardie's answer here's how Python check file mode in the function fileio_init():
s = mode;
while (*s) {
switch (*s++) {
case 'r':
if (rwa) {
bad_mode:
PyErr_SetString(PyExc_ValueError,
"Must have exactly one of read/write/append mode");
goto error;
}
rwa = 1;
self->readable = 1;
break;
case 'w':
if (rwa)
goto bad_mode;
rwa = 1;
self->writable = 1;
flags |= O_CREAT | O_TRUNC;
break;
case 'a':
if (rwa)
goto bad_mode;
rwa = 1;
self->writable = 1;
flags |= O_CREAT;
append = 1;
break;
case 'b':
break;
case '+':
if (plus)
goto bad_mode;
self->readable = self->writable = 1;
plus = 1;
break;
default:
PyErr_Format(PyExc_ValueError,
"invalid mode: %.200s", mode);
goto error;
}
}
if (!rwa)
goto bad_mode;
That is: only "rwab+"
characters are allowed; there must be exactly one of "rwa"
, at most one '+'
and 'b'
is a noop.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With