В питоне встроенного открытой функции, какова точная разница между режимами w
, a
, w+
, a+
, и r+
?
В частности, документация подразумевает, что все это позволит записывать в файл, и говорит, что она открывает файлы для «добавления», «записи» и «обновления» конкретно, но не определяет, что означают эти термины.
Ответы:
Режимы работы являются точно такими же , как для функции стандартной библиотеки C
fopen()
.Страница
fopen
руководства BSD определяет их следующим образом:источник
w
иw+
оба могут сделатьThe file is created if it does not exist
b
добавляется в режиме открывает файл в двоичном режиме, таким образом , есть также режимы , такие какrb
,wb
, иr+b
. Python в Windows делает различие между текстовыми и двоичными файлами; символы конца строки в текстовых файлах автоматически слегка изменяются при чтении или записи данных.+
не делает что-то непротиворечивое независимо, если это такa
,w
илиr
? Или я не вижу картины? Какой шаблон?Я заметил, что время от времени мне нужно снова и снова открывать Google, чтобы создать мысленное представление о том, каковы основные различия между режимами. Итак, я думал, что диаграмма будет читать быстрее в следующий раз. Может быть, кто-то еще найдет это полезным.
источник
a
Описание неправильно . Записи всегда располагаются в конце.Subsequent writes to the file will always end up at the then current end of file, irrespective of any intervening fseek(3) or similar
которое несколько сильнее, чем просто сказать, что начальная позиция - это конец.Та же информация, только в форме таблицы
где значения: (просто чтобы избежать неправильного толкования)
запись - запись в файл разрешена
создать - файл создается, если он еще не существует
trunctate - при открытии файла он становится пустым (все содержимое файла стирается)
позиция в начале - после открытия файла начальная позиция устанавливается в начале файла
Примечание:
a
иa+
всегда добавлять в конец файла - игнорирует любыеseek
движения.КСТАТИ. интересное поведение по крайней мере на моем win7 / python2.7, для нового файла, открытого в
a+
режиме:write('aa'); seek(0, 0); read(1); write('b')
- второеwrite
игнорируетсяwrite('aa'); seek(0, 0); read(2); write('b')
- второеwrite
поднимаетсяIOError
источник
open(file,'a'); close(); open(file,'r+')
для этого.a
иa+
write всегда будет происходить в конце файла, независимо от того, перемещаете ли вы указатель вручную, используяseek()
.Параметры те же, что и для функции fopen в стандартной библиотеке C:
w
обрезает файл, перезаписывая все, что уже былоa
добавляет в файл, добавляя к тому, что уже было тамw+
открывает для чтения и записи, обрезает файл, но также позволяет вам прочитать то, что было записано в файлa+
открывается для добавления и чтения, позволяя вам как добавить файл, так и прочитать его содержимоеисточник
Я думаю, что это важно учитывать для кроссплатформенного исполнения, то есть как CYA. :)
Это напрямую цитата из 2.7.x Python Software Foundation , .
источник
Я наткнулся на это, пытаясь понять, почему вы используете режим «w +» против «w». В конце концов, я только что провел тестирование. Я не вижу особой цели для режима 'w +', так как в обоих случаях файл усекается с самого начала. Тем не менее, с помощью 'w +' вы можете читать после записи, выполняя поиск назад. Если вы попытаетесь прочитать с помощью 'w', это вызовет ошибку IOError. Чтение без использования поиска в режиме 'w +' ничего не даст, поскольку указатель файла будет после того места, где вы написали.
источник