Python中打开文件时的“wua”模式是什么?
我最近在查看我们的一些Windows上的Python 2.4代码,发现了这个:
self.logfile = open(self.logfile_name, "wua")
我知道w
、u
和a
各自的作用,但当把它们组合在一起时会发生什么呢?
3 个回答
2
在Python 2.4的背后,内置的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
'会被忽略。
3
我没注意到你知道这些修饰符的作用。它们组合在一起会有以下效果:
A和W一起用是多余的,因为它们都会打开文件进行写入。使用W时,文件会被覆盖;而使用A时,新的内容会被添加到已有内容的后面。
U的意思是“以文本文件的形式打开文件XXX,并且可以识别各种换行符”。
- W是写入的意思
- A是追加的意思
- U会把文件转换为使用定义的换行符。
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
都是用来 打开文件进行写入,但是前者是追加内容,而后者是截断文件。)