当前位置:  开发笔记 > 编程语言 > 正文

Python文件模式细节

如何解决《Python文件模式细节》经验,为你挑选了2个好方法。

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

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

我收到错误:

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

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

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

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



1> Jarret Hardi..:

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


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

2> jfs..:

作为@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;

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


@Qwerty:看[如何"while(*s ++ =*t ++)"工作?](http://stackoverflow.com/questions/810129/how-does-whiles-t-work)来理解`*s`, C中的`*s ++`
推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有