Подробные сведения о файлах Python

В Python следующие операторы не работают:

f = open("ftmp", "rw")
print >> f, "python"

Я получаю сообщение об ошибке:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 9] Bad file descriptor

Но со следующим кодом он работает:

g = open("ftmp", "r+")
print >> g, "python"

Похоже, мне нужно пересмотреть режимы файлов. Каковы глубинные тонкости режимов открытия файлов?

Ответ 1

В качестве дополнения к @Jarret Hardie answer здесь, как режим проверки файла Python в функции 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;

То есть: допускаются только символы "rwab+"; должен быть ровно один из "rwa", не более одного '+' и 'b' является noop.

Ответ 2

Еще лучше, пусть документация сделает это за вас: http://docs.python.org/library/functions.html#open. Ваша проблема в вопросе заключается в том, что нет режима "rw"... вы, вероятно, хотите "r +", как вы писали (или "a +", если файл еще не существует).