Открывать файлы в режимах 'rt' и 'wt'


109

Несколько раз здесь , на SO я видел людей , использующих rtи wtрежимы для чтения и записи файлов.

Например:

with open('input.txt', 'rt') as input_file:
     with open('output.txt', 'wt') as output_file: 
         ...

Я не вижу задокументированных режимов , но поскольку open()не вызывает ошибок - похоже, что их использование вполне законно.

Для чего это нужно и есть ли разница между использованием wtvs wи rtvs r?

Ответы:


194

tотносится к текстовому режиму. Нет никакой разницы между rи rtили wи, wtпоскольку по умолчанию используется текстовый режим.

Документировано здесь :

Character   Meaning
'r'     open for reading (default)
'w'     open for writing, truncating the file first
'x'     open for exclusive creation, failing if the file already exists
'a'     open for writing, appending to the end of the file if it exists
'b'     binary mode
't'     text mode (default)
'+'     open a disk file for updating (reading and writing)
'U'     universal newlines mode (deprecated)

Режим по умолчанию - 'r'(открыт для чтения текста, синоним 'rt').


4
Попался, это задокументировано в документации python3. Итак, в основном нет разницы между wtvs wи rtvs r- просто explicit is better than implicit?
alecxe

@alecxe Правильно, поскольку текстовый режим является по умолчанию, нет разницы между rи rt...
devnull

9
Обратите внимание, что wне всегда равно wt. Одним из таких случаев является gzip.openдвоичный режим по умолчанию, а не текстовый режим. Связанный вопрос: stackoverflow.com/questions/42013083/…
Карл Экерот 08

9

Значок tуказывает на текстовый режим, означающий, что \nсимволы будут преобразованы в окончание строк ОС хоста при записи в файл и обратно при чтении. Флаг - это просто шум, поскольку по умолчанию используется текстовый режим.

В остальном Uэти флаги режима поступают непосредственно из функции стандартной библиотеки C fopen(), что задокументировано в шестом абзаце документации python2 для open().

Насколько мне известно, tон не является и никогда не был частью стандарта C, поэтому, хотя многие реализации библиотеки C все равно принимают его, нет никакой гарантии, что все они будут, и, следовательно, нет гарантии, что он будет работать на каждой сборке питон. Это объясняет, почему в документации python2 он не указан и почему он все равно работал. Документы python3 делают его официальным.


4

«R» - для чтения, «w» - для записи, а «a» - для добавления.

Буква «t» представляет текстовый режим в отличие от двоичного режима.

Несколько раз здесь, на SO, я видел людей, использующих режимы rt и wt для чтения и записи файлов.

Изменить: вы уверены, что видели rt, а не rb?

Эти функции обычно оборачивают fopen функцию , описанную здесь:

http://www.cplusplus.com/reference/cstdio/fopen/

Как видите, здесь упоминается использование b для открытия файла в двоичном режиме.

Ссылка на документ, которую вы предоставили, также ссылается на этот режим b:

Добавление "b" полезно даже в системах, которые не обрабатывают двоичные и текстовые файлы по-разному, где оно служит документацией.


Да, это было ясно rt, например, stackoverflow.com/questions/10971033/… или stackoverflow.com/questions/17127853/… и т. Д. Спасибо за информацию, полезно знать.
alecxe

В ссылке, которую предоставляет devnull, указан текстовый вариант 't'. Что меня удивило, так это то, что ссылка на C ++ также не упоминает эту опцию 't', поскольку я почти уверен, что использовал опции 'rt' и 'wt' в коде C fopen, написанном много лет назад.
jussij

Да, поэтому я и спросил - для меня это была как недокументированная функция. Надеюсь, эта ветка поможет кому-то в будущем. Еще раз спасибо.
alecxe

3

t указывает на text mode

https://docs.python.org/release/3.1.5/library/functions.html#open

в Linux нет разницы между текстовым режимом и двоичным режимом, однако в Windows они преобразуются \nв \r\nтекстовый режим.

http://www.cygwin.com/cygwin-ug-net/using-textbinary.html


5
В Python 3 есть дополнительная разница между режимами текстового и двоичного файлов (на всех платформах). В текстовом режиме readвозвращает строки Unicode. В двоичном режиме readвозвращает bytesэкземпляр. Если вы хотите написать код Python 2 с учетом прямой совместимости, вы можете использовать io.openвместо стандарта openдля получения поведения Python 3 (с unicodeпротивоположными strэкземплярами).
Blckknght
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.