我最近一直在浏览一些我们的Windows python 2.4代码并遇到这个问题:
self.logfile = open(self.logfile_name, "wua")
我知道w
,u
和a
自己做了什么,但是当你将它们组合时会发生什么?
答案 0 :(得分:5)
a
是多余的。 wua
与wu
相同,因为w
首先出现,因此会截断文件。如果您要撤消订单,即auw
,那将与au
相同。可视化:
>>> f = open('test.txt', 'r')
>>> f.read()
'Initial contents\n'
>>> f.close()
>>> f = open('test.txt', 'wua')
>>> print >> f, 'writing'
>>> f.close()
>>> f = open('test.txt', 'r')
>>> f.read()
'writing\n'
>>> f.close()
>>> f = open('test.txt', 'auw')
>>> print >> f, 'appending'
>>> f.close()
>>> f = open('test.txt', 'r')
>>> f.read()
'writing\nappending\n'
>>> f.close()
(提醒:a
和w
open the file for writing,但前者会在其他截断时附加。)
答案 1 :(得分:3)
我没注意到你知道修饰语的作用。合并后他们将执行以下操作:
A和W在一起是多余的,因为两者都会开放写作。使用W时,文件将被覆盖。使用A时,所有新文本都会附加在现有内容之后。U表示“打开文件XXX以输入为具有通用换行符解释的文本文件”。
答案 2 :(得分:2)
在底层,Python 2.4将内置open
的参数传递给操作系统的fopen
函数。在某些条件下,Python会对模式字符串进行一些修改。
if (strcmp(mode, "U") == 0 || strcmp(mode, "rU") == 0)
mode = "rb";
因此,如果您传递大写U
或rU
,它将打开文件进行二进制读取。查看GNU libc源代码,根据描述fopen
的Windows实现的MSDN页面,将忽略“u
”选项。
模式字符串中有多个模式标识符(“r
”,“w
”和“a
”)无效。通过查看模式字符串解析的GNU libc实现可以看出这一点:
switch (*mode)
{
case 'r':
omode = O_RDONLY;
break;
case 'w':
omode = O_WRONLY;
oflags = O_CREAT|O_TRUNC;
break;
case 'a':
omode = O_WRONLY;
oflags = O_CREAT|O_APPEND;
break;
default:
__set_errno (EINVAL);
return NULL;
}
搜索模式字符串的第一个字符,查找“r
”,“w
”或“a
”之一,如果它不是这些字符之一,则会引发错误
因此,当一个文件被打开为“wua
”时,它将被打开以便仅写入,如果它不存在并被截断则被创建。 <{1}}和“u
”将被忽略。