Режимы чтения и записи файлов
Режимы чтения и записи определены [python-buildin-functions] open(file, mode='r', buffering=- 1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
(смотри докумсентацию)
Функция открывает файл и воозвращает соответствующий файловый объект. Если файл не может быть открыт, возникает ошибка OSError
.
file — это объект, подобный пути, задающий путь (абсолютный или относительный к текущему рабочему каталогу) файла, который нужно открыть, или целочисленный файловый дескриптор файла, который нужно обернуть. (Если указан файловый дескриптор, он закрывается при закрытии возвращаемого объекта ввода-вывода, если только для параметра closefd не задано значение False.)
mode — необязательная строка, указывающая режим, в котором открывается файл. По умолчанию это r
.
mode-string | truncate? | create? | what's allowed
-------------+-----------+---------+----------------
r | no | no | reading (only)
w | yes | yes | writing (only)
a | no | yes | writing (only), auto-appends
r+ | no | no | read and write
w+ | yes | yes | read and write
a+ | no | yes | read and (auto-appending) write
The argument mode points to a string beginning with one of the following
sequences (Additional characters may follow these sequences.):
``r'' Open text file for reading. The stream is positioned at the
beginning of the file.
``r+'' Open for reading and writing. The stream is positioned at the
beginning of the file.
``w'' Truncate file to zero length or create text file for writing.
The stream is positioned at the beginning of the file.
``w+'' Open for reading and writing. The file is created if it does not
exist, otherwise it is truncated. The stream is positioned at
the beginning of the file.
``a'' Open for writing. The file is created if it does not exist. The
stream is positioned at the end of the file. Subsequent writes
to the file will always end up at the then current end of file,
irrespective of any intervening fseek(3) or similar.
``a+'' Open for reading and writing. The file is created if it does not
exist. The stream is positioned at the end of the file. Subse-
quent writes to the file will always end up at the then current
end of file, irrespective of any intervening fseek(3) or similar.
Важдными нюансами являются следующие аспекты:
- какие операции можно производить над файлом
- что происходит с содержимым
- где оказывается курсор после открытия файла
Когда мы вызываем метод, производящий усечение файла, даже если этио режим w+
- файл будет усечен при открытии. Т.е. все что в нем находилось будет удалено - это может иметь значение, если, к примеру, нам надо открыть файл, прочитать его содержимое, сравнить с чем-то и перезаписать, если есть разница.
При откритии файла в режиме, позволяющем его дополнять, курсор помещается в конце файла.
Чтобы решить приведенную выше нестандартную задачу, возможно придется открыть файл в режиме a+
, затем передвинуть курсор в начало файла и прочитать его, а затем, если нам надо полностью перезаписать содержимое - произвести усечение. Сделать это можно примерно так:
with open(file_name,"a+") as f:
f.seek(0) # move cursor to the start of the file
data= f.readlines()
# do something with data
f.truncate(0) # trunkate file
f.write("Write new data")
Смотир еще: