Python файловые режимы подробно - PullRequest
12 голосов
/ 17 марта 2009

В 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"

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

Ответы [ 3 ]

17 голосов
/ 17 марта 2009

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

12 голосов
/ 18 марта 2009

В дополнение к @ ответ Джаррета Харди вот как 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.

0 голосов
/ 17 марта 2009

На самом деле это нормально, но я нашел режим "rw" на сокете в следующем коде (для Python на S60 ) в строках 42 и 45:

http://www.mobilenin.com/mobilepythonbook/examples/057-btchat.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...