Что такое режим "wua" при открытии файла в python? - PullRequest
4 голосов
/ 20 мая 2009

Я недавно просматривал некоторые из наших кодов Windows Python 2.4 и наткнулся на это:

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

Я знаю, что w, u и a делают самостоятельно, но что происходит, когда вы их объединяете?

Ответы [ 3 ]

5 голосов
/ 20 мая 2009

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 открывают файл для записи , но первый добавляется, а другие усекаются.)

3 голосов
/ 20 мая 2009

Я не заметил, что вы знали, что сделали модификаторы. В совокупности они будут делать следующее:

A и W вместе излишни, так как оба откроются для записи. При использовании W файл будет перезаписан. При использовании A весь новый текст добавляется после существующего содержимого.

U означает «открыть файл XXX для ввода в виде текстового файла с универсальной интерпретацией новой строки».

  • W для записи
  • А для добавления
  • U будет преобразовать файл, чтобы использовать определенный символ новой строки.

Подробнее здесь: http://codesnippets.joyent.com/posts/show/1969

2 голосов
/ 21 мая 2009

Под капотом 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» будут игнорироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...