2015-07-19 79 views
19

我注意到,除了文档模式字符以外,Windows XP和8.1中的Python 2.7.5.1至少在读取文件时也接受UD模式。模式U用于numpy的genfromtxt。模式D有文件被删除的效果,按照下面的代码片段:Python文件打开功能模式

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

有谁知道更多有关这些模式,它们尤其是是否也适用于Linux系统的语言的一个永久的特征?

+3

对于Linux上的现有文件,open('text.txt','rD')'不会为我提供任何错误,尽管该文件在关闭时不会被删除。我真的很惊讶,如果这是真的,这个行为是[没有文档](https://docs.python.org/2/library/functions.html#open)。虽然记录了'U'国旗。 – rth

+2

刚刚在Windows上复制。这确实很奇怪。 – tmr232

+3

刚才我犯了同样的错误。提到是[这里](https://github.com/python/cpython/blob/2.7/Objects/fileobject.c#L209)。在fileobject中,而不是io。 – tmr232

回答

8

D标志似乎是Windows特定的。 Windows似乎在其CRT中的fopen函数中添加了几个标志,如here所述。

尽管Python会过滤模式字符串以确保不会产生错误,但它确实允许使用某些特殊标志,如Python源代码here中所示。具体而言,似乎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](https://msdn.microsoft.com/zh-cn/library/windows/desktop /aa363858%28v=vs.85%29.aspx)函数。 –

+2

“我会建议坚持记录的选项”耶!另请参阅[module tempfile](https://docs.python.org/2/library/tempfile.html?highlight=tempfile#tempfile.TemporaryFile) – msw

5

这有点让人误解。 open() as mode 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'的模式是 ,与普通文本模式相同。请注意,如此打开的文件对象 也有一个称为换行符的属性,其值为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”只读即,然后让/ CLOS通过后删除它会添加一个像“D”这样的单个字符,即使意外地是一个严重的安全问题,我想。

但是,如果这有一些不可避免的功能,请通知我。

+1

我无法重现,但也许这是一些其他潜在的文件问题,我想? – Geeocode

+1

@rth转载请看上面的tmr232回应,请您参考U文件吗? – NameOfTheRose

+0

@GyörgySolymosi你会给予python和os版本 – NameOfTheRose