打开Python文件时,什么是"wua"模式?

4

最近我在检查我们的Windows Python 2.4代码时发现了这个问题:

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

我知道单独使用 wua 时它们各自代表什么意思,但是当它们组合在一起时会发生什么呢?
3个回答

5

a 是多余的。因为 w 出现在前面,会截断文件,所以 wuawu 是相同的。如果你把它们的顺序颠倒,也就是 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 打开文件进行写入,但前者会追加内容,而后者则会截断。)

3
我没有注意到您知道修改器的作用。它们结合在一起将执行以下操作:
A 和 W 结合在一起是多余的,因为两者都将用于打开文件进行写入。使用 W 时,文件将被覆盖。使用 A 时,所有新文本都将附加在现有内容之后。
U 表示“以通用换行符解释方式打开文件 XXX 作为文本文件进行输入”。
  • W 用于写入
  • A 用于附加
  • U 将转换文件以使用定义的换行字符。
更多信息请参见:http://codesnippets.joyent.com/posts/show/1969

2
在 Python 2.4 中,内置函数 open 的参数会被传递给操作系统的 fopen 函数。在某些情况下,Python 会对模式字符串进行一些处理。
if (strcmp(mode, "U") == 0 || strcmp(mode, "rU") == 0)
    mode = "rb";

如果传递大写的UrU,则会以二进制读取模式打开文件。根据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' 将被忽略。


谢谢你解释了事物内部的实现! - balu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接