Python文件打开函数模式

20

我注意到,除了文档模式字符外,在Windows XP和8.1中的Python 2.7.5.1在读取文件时也接受模式UD。模式U在numpy的genfromtxt中使用。模式D的效果是删除文件,如下代码片段所示:

 f = open('text.txt','rD')
 print(f.next())
 f.close()  # file text.txt is deleted when closed

有人知道这些模式的更多信息吗,特别是它们是否是语言的永久特征,在Linux系统上也适用吗?


3
在Linux上打开一个已存在的文件时,使用open('text.txt', 'rD')没有引发任何错误,尽管在关闭时该文件并未被删除。如果这是真的话,我感到非常惊讶,因为这种行为未被记录在文档中。虽然 U标志有记录。 - rth
2
刚在 Windows 上复制了这个。这确实非常奇怪。 - tmr232
3
我刚才犯了同样的错误。提到的是这里。在fileobject而不是io中。 - tmr232
@tmr232,请问你能提供一下Python和操作系统的版本吗?你所指的错误是指什么? - NameOfTheRose
1
Windows 8,Python 2.7.10 32位。 - tmr232
2个回答

8
D标志似乎只适用于Windows。Windows在其CRT中向fopen函数添加了几个标志,如此处所述。
虽然Python确保模式字符串不会出现错误,但它允许一些特殊标志,可以在这里的Python源代码中看到。具体而言,似乎过滤掉了N标志,而允许使用TD标志。
while (*++mode) {
    if (*mode == ' ' || *mode == 'N') /* ignore spaces and N */
        continue;
    s = "+TD"; /* each of this can appear only once */
    ...

我建议坚持使用文档记录的选项,以保持代码跨平台性。

3
请参阅有关 Windows CreateFile 函数的文档。 - PM 2Ring
2
我建议坚持使用文档记录的选项。另外,参见模块tempfile - msw

5
这有点误导性。作为模式参数,open()接受任何字符,而您可以传递一个有效的字符,例如:"w,r,b,+,a"
因此,您可以编写:open("fname", "w+ANYTHINGYOUWANT")。 它将打开文件,就像open("fname", "w+")一样。 而open("fname", "rANYTHINGYOUWANT")。 将打开文件,就像open("fname", "r")一样。
关于“U”标志:
除了标准的fopen()值,mode可以是'U'或'rU'。Python通常使用通用换行符支持;提供'U'将文件打开为文本文件,但行可能以以下任何一种方式终止:Unix行结束约定'\n'、Macintosh约定'\r'或Windows约定'\r\n'。所有这些外部表示都被Python程序视为'\n'。如果Python没有构建通用换行符支持,则带有'U'的模式与普通文本模式相同。请注意,这样打开的文件对象还具有称为newlines的属性,其值为None(如果尚未看到换行符)、'\n'、'\r'、'\r\n'或包含所有已看到的换行符类型的元组。
正如您可以在Python文档https://docs.python.org/2/library/functions.html#open中阅读的那样。
编辑:
D:指定一个文件作为临时文件。当最后一个文件指针关闭时,它将被删除。
正如@tmr232的链接中所述。 选项是和<_fdopen>的微软扩展,在需要ANSI可移植性的情况下不应使用。 进一步更新: 我建议将此现象提交为错误,因为以只读方式打开文件,即使用标志“r”,然后允许在关闭后/通过添加一个字符像“D”来删除,即使是意外的也是一个严重的安全问题,我认为。 但是,如果这有一些不可避免的功能,请告诉我。

1
我可能无法复现那个问题,但也许这是其他潜在的文件问题,我猜? - Geeocode
1
@rth已经复现了,可以参考上面tmr232的回答,请问你能提供U文档的参考吗? - NameOfTheRose
@GyörgySolymosi 请提供Python和操作系统版本。 - NameOfTheRose
1
@user2422503 在Linux下使用Python 2.7.9 - Geeocode
1
是的,使用 open(..., 'rD') 时也会删除。 - tmr232
@PM2Ring 在Windows中似乎没有什么不可能的,所以我更新了我的答案,谢谢 :) - Geeocode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接