我注意到,除了记录的模式字符外,Windows XP和8.1中的Python 2.7.5.1至少在读取文件时也接受模式U
和D
。模式U
用于numpy的genfromtxt
。模式D
具有删除文件的效果,如下面的代码片段所示:
f = open('text.txt','rD')
print(f.next())
f.close() # file text.txt is deleted when closed
有没有人更了解这些模式,特别是它们是否也是Linux系统上适用的语言的永久特性?
答案 0 :(得分:8)
D
标志似乎是Windows特定的。 Windows似乎在其CRT中为fopen
函数添加了几个标志,如here所述。
虽然Python确实过滤了模式字符串以确保没有错误,但它确实允许一些特殊的标志,如Python源here中所示。具体来说,似乎过滤了N
标志,而允许T
和D
标志:
while (*++mode) {
if (*mode == ' ' || *mode == 'N') /* ignore spaces and N */
continue;
s = "+TD"; /* each of this can appear only once */
...
我建议坚持使用记录的选项来保持代码跨平台。
答案 1 :(得分:5)
这有点误导。
open()
作为模式arg接受任何字符,而你传递有效的字符,即:"w,r,b,+,a"
。
因此你可以写:open("fname", "w+ANYTHINGYOUWANT")
。
它将以open("fname", "w+")
打开文件。
并open("fname", "rANYTHINGYOUWANT")
。
将文件打开为open("fname", "w+")
。
关于“U”标志:
除了标准的fopen()值模式可能是'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的链接。
c,n,t,S,R,T和D模式选项为 Microsoft扩展程序 fopen和_fdopen,不应该在ANSI可移植性的地方使用 期望的
进一步更新:
我建议将这种现象作为一个错误提交,因为打开一个文件只读,即标记为“r”,然后允许删除之后/通过关闭它添加单个字符如“D”,甚至意外我认为这是一个严重的安全问题。
但是,如果这有一些不可避免的功能,请通知我。