在python中打开文件时“wua”模式是什么?

时间:2009-05-20 05:13:13

标签: python file

我最近一直在浏览一些我们的Windows python 2.4代码并遇到这个问题:

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

我知道wua自己做了什么,但是当你将它们组合时会发生什么?

3 个答案:

答案 0 :(得分: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 open the file for writing,但前者会在其他截断时附加。)

答案 1 :(得分:3)

我没注意到你知道修饰语的作用。合并后他们将执行以下操作:

A和W在一起是多余的,因为两者都会开放写作。使用W时,文件将被覆盖。使用A时,所有新文本都会附加在现有内容之后。

U表示“打开文件XXX以输入为具有通用换行符解释的文本文件”。

  • W代表写入
  • A代表追加
  • 你会的 转换文件以使用定义的 换行符。

更多信息: http://codesnippets.joyent.com/posts/show/1969

答案 2 :(得分:2)

在底层,Python 2.4将内置open的参数传递给操作系统的fopen函数。在某些条件下,Python会对模式字符串进行一些修改。

if (strcmp(mode, "U") == 0 || strcmp(mode, "rU") == 0)
    mode = "rb";

因此,如果您传递大写UrU,它将打开文件进行二进制读取。查看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”将被忽略。