Python中打开文件时的“wua”模式是什么?

4 投票
3 回答
961 浏览
提问于 2025-04-15 11:43

我最近在查看我们的一些Windows上的Python 2.4代码,发现了这个:

self.logfile = open(self.logfile_name, "wua")

我知道wua各自的作用,但当把它们组合在一起时会发生什么呢?

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会把文件转换为使用定义的换行符。

更多内容请见: http://codesnippets.joyent.com/posts/show/1969

5

这里的 a 是多余的。wuawu 是一样的,因为 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()

(提醒一下:aw 都是用来 打开文件进行写入,但是前者是追加内容,而后者是截断文件。)

撰写回答