最近我在检查我们的Windows Python 2.4代码时发现了这个问题:
self.logfile = open(self.logfile_name, "wua")
我知道单独使用
w
、u
和 a
时它们各自代表什么意思,但是当它们组合在一起时会发生什么呢?a
是多余的。因为 w
出现在前面,会截断文件,所以 wua
和 wu
是相同的。如果你把它们的顺序颠倒,也就是 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
的参数会被传递给操作系统的 fopen
函数。在某些情况下,Python 会对模式字符串进行一些处理。if (strcmp(mode, "U") == 0 || strcmp(mode, "rU") == 0)
mode = "rb";
U
或rU
,则会以二进制读取模式打开文件。根据GNU libc源代码和MSDN页面描述的Windows实现的fopen
函数,'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
" 形式打开时,它将仅用于写入,如果不存在则创建并截断。 'u
' 和 'a
' 将被忽略。