【问题标题】:Python file modes detailPython 文件模式详细信息
【发布时间】:2010-10-13 20:39:13
【问题描述】:

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

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

【问题讨论】:

    标签: python file-io


    【解决方案1】:

    更好的是,让文档为您完成:http://docs.python.org/library/functions.html#open。你的问题是没有“rw”模式......你可能想要'r+'作为你写的(或'a+'如果文件尚不存在)。

    【讨论】:

    • 文档不足。这并不是说你不能拥有rw。它没有说明w+w 之间的区别是什么(“更新”到底是什么意思?),也没有说明a 是否会搜索到文件的末尾(我认为它确实如此) ,但也许不是)。而且它并没有给出一个明确的方法来打开一个文件进行读写,一开始就没有截断它。
    【解决方案2】:

    事实上,这没关系,但我在以下代码中的第 42 行和第 45 行发现了套接字上的“rw”模式(对于S60 上的 Python):

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

    【讨论】:

    • docs.python.org/library/socket.html#module-socket。 “注意某些行为可能与平台相关,因为调用的是操作系统套接字 API。”所以这听起来像是 S60 特有的功能。
    • 我还要指出 r+ 和 a+ 可以读写。用r+打开一个文件,你可以随意在文件周围seek(),覆盖或者追加内容。是否有您认为“+”系列不提供的功能?
    【解决方案3】:

    作为@Jarret Hardie's 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' 最多只有一个。

    【讨论】:

    • 哇,while(*s) 和 switch (*s++) 是如何工作的? oO 从我所见,它会逐个字符地撕裂字符串吗?但是 *++ 是什么意思呢?
    • @Qwerty:请参阅 How does “while(*s++ = *t++)” work? 以了解 C 中的 *s*s++
    【解决方案4】:

    https://www.geeksforgeeks.org/python-append-to-a-file/

    use the append if the file exists and write if it does not.
    
     import pathlib
     file = pathlib.Path("guru99.txt")
     if file.exists ():
          file1 = open("myfile.txt", "a")  # append mode  
     else:
          file1 = open("myfile.txt", "w")  # append mode
    
    
    file1.write("Today \n")
    file1.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多