Python文件模式细节

Xol*_*lve 12 python file-io

在Python中,以下语句不起作用:

f = open("ftmp", "rw")
print >> f, "python"
Run Code Online (Sandbox Code Playgroud)

我收到错误:

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

但是使用以下代码它可以工作:

g = open("ftmp", "r+")
print >> g, "python"
Run Code Online (Sandbox Code Playgroud)

看起来我需要修改文件模式.文件打开模式的深层复杂性是什么?

Jar*_*die 17

更好的是,让文档为您完成:http://docs.python.org/library/functions.html#open.您在问题中的问题是没有"rw"模式......您可能在编写时需要"r +"(如果文件尚不存在,则为"a +").

  • 文档不足.它并没有说你不能拥有`r`和`w`.它没有说'w +'和`w`之间的区别是什么("更新"究竟是什么意思?),并没有说'a`是否寻找到文件的末尾(我认为它确实,但也许不是).并且它没有给出明确的方法来打开文件进行读写,而不是截断它. (12认同)

jfs*_*jfs 12

作为@Jarret Hardie的补充,这里回答了函数fileio_init()中 Python检查文件模式的方式:

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;
Run Code Online (Sandbox Code Playgroud)

那就是:只"rwab+"允许字符; 必须有一个"rwa",最多一个,'+'并且'b'是一个noop.

  • @Qwerty:看[如何"while(*s ++ =*t ++)"工作?](http://stackoverflow.com/questions/810129/how-does-whiles-t-work)来理解`*s`, C中的`*s ++` (2认同)