Подтвердить что ты не робот

Режимы работы открытых файлов Python

Я заметил, что, помимо символов документального режима, Python 2.7.5.1 в Windows XP и 8.1 также принимает режимы U и D, по крайней мере, при чтении файлов. Режим U используется в numpy genfromtxt. Режим D приводит к удалению файла в соответствии с следующим фрагментом кода:

 f = open('text.txt','rD')
 print(f.next())
 f.close()  # file text.txt is deleted when closed

Знает ли кто-нибудь больше об этих режимах, особенно, являются ли они постоянной функцией языка, применимого и в Linux-системах?

4b9b3361

Ответ 1

Флаг D, по-видимому, зависит от Windows. Кажется, что Windows добавляет несколько флагов в функцию fopen в своем CRT, как описано здесь.

В то время как Python фильтрует строку режима, чтобы убедиться, что из нее не возникли ошибки, она позволяет некоторые специальные флаги, как это видно из источников Python . В частности, кажется, что флаг N отфильтровывается, а флаги T и D разрешены:

while (*++mode) {
    if (*mode == ' ' || *mode == 'N') /* ignore spaces and N */
        continue;
    s = "+TD"; /* each of this can appear only once */
    ...

Я бы посоветовал придерживаться документированных опций, чтобы сохранить межплатформенный код.

Ответ 2

Это немного вводит в заблуждение. open(), поскольку режим arg принимает любой символ, в то время как вы передаете действительный номер i.e.: "w,r,b,+,a".

Таким образом, вы можете написать: open("fname", "w+ANYTHINGYOUWANT"). Он откроет файл как open("fname", "w+"). И open("fname", "rANYTHINGYOUWANT"). откроет файл как open("fname", "w+").

Что касается флага "U":

В дополнение к стандартным режимам fopen() может быть "U" или "rU". Python обычно создается с поддержкой универсальной новой строки; снабжая 'U' открывает файл в виде текстового файла, но строки могут быть прерваны любым из следующее: окончательное соглашение Unix '\n', Macintosh соглашение '\ r' или соглашение Windows '\ r\n'. Все эти внешние представления рассматриваются как "\n" программой Python. Если Python построен без универсальных новых линий, поддерживает режим с 'U' аналогично нормальному текстовому режиму. Обратите внимание, что файлы, открытые так же имеют атрибут, называемый newlines, который имеет значение None (если нет новые линии еще не видели), '\n', '\ r', '\ r\n' или кортеж содержащий все видимые типы новой строки.

Как вы можете прочитать в документации Python https://docs.python.org/2/library/functions.html#open

EDIT:

D: Указывает файл как временный. Он удаляется, когда последний файл указатель закрыт.

поскольку вы можете читать ссылку @tmr232.

Параметры режима c, n, t, S, R, T и D являются расширениями Microsoft для fopen и _fdopen и не должны использоваться там, где переносимость ANSI желательно

Дальнейшее обновление:

Я предлагаю представить это явление как ошибку, потому что открытие файла выполняется только как чтение, т.е. с флагом "r", а затем позволяет удалять после/через закрытие, добавляя один символ, такой как "D", даже случайно я думаю, серьезная проблема безопасности.

Но если это имеет некоторые неизбежные функции, сообщите мне.