open() в Python не создает файл, если он не существует
Какой лучший способ открыть файл для чтения и записи, если он существует, или создать его и открыть для чтения и записи, если его нет? Из того, что я читал, должно работать так: file = open('myfile.dat', 'rw')
, верно?
У меня это не работает (Python 2.6.2), и я задумался, связано ли это с версией, или это не должно работать таким образом, или что-то еще.
Закрывающая директория была доступна для записи пользователем и группой, но не для других (у меня Linux... т.е. права 775). А точная ошибка была следующей:
IOError: no such file or directory.
5 ответ(ов)
Вы должны использовать open
с режимом w+
:
file = open('myfile.dat', 'w+')
Режим w+
позволяет одновременно читать и записывать в файл. Если файл не существует, он будет создан, а если существует — его содержимое будет очищено. Не забудьте закрыть файл после завершения работы с ним, используя file.close()
, или лучше использовать конструкцию with
, чтобы автоматически закрывать файл:
with open('myfile.dat', 'w+') as file:
# Ваш код для чтения и записи в файл
В Python для работы с файлами используются различные режимы открытия. Ваша таблица режимов выглядит следующим образом:
w
— режим записи (write mode)r
— режим чтения (read mode)a
— режим добавления (append mode)
Также существуют комбинированные режимы:
w+
— создаёт файл, если он не существует, и открывает его в режиме записи.r+
— открывает файл для чтения и записи, но не создаёт новый файл, если он отсутствует.a+
— создаёт файл, если он не существует, и открывает его в режиме добавления.
Пример использования:
file_name = 'my_file.txt'
f = open(file_name, 'w+') # открываем файл в режиме записи
f.write('python rules')
f.close()
В этом примере создаётся (или перезаписывается, если файл уже существует) файл my_file.txt
, и в него записывается строка 'python rules'
. Обратите внимание, что в данном коде вы находитесь в рабочем каталоге, где этот файл будет создан.
[Кстати, я использую Python версии 3.6.2]
Хорошей практикой является использование следующего кода:
import os
writepath = 'some/path/to/file.txt'
mode = 'a' if os.path.exists(writepath) else 'w'
with open(writepath, mode) as f:
f.write('Hello, world!\n')
В этом примере проверяется, существует ли уже файл по заданному пути. Если файл существует, используется режим 'a' (добавление), иначе - режим 'w' (запись с перезаписью). Это позволяет избежать потери данных, если вы хотите сохранять информацию в уже существующий файл.
С 3.4 версии Python рекомендуется использовать модуль pathlib
для "создания" файлов. Это гораздо более элегантное решение по сравнению с предложенными в этой теме.
Вот пример:
from pathlib import Path
filename = Path('myfile.txt')
filename.touch(exist_ok=True) # создаст файл, если он не существует, иначе ничего не произойдёт
file = open(filename)
Аналогично можно создать директорию:
filename.mkdir(parents=True, exist_ok=True)
Такой подход делает код более читаемым и удобным для работы с файловой системой.
Чтобы изменить режим открытия файла с "rw" на "w+", просто замените "rw" на "w+" в вашем коде. Например:
with open('filename.txt', 'w+') as file:
# Ваш код здесь
Если вам нужно добавлять данные в файл, не удаляя уже существующий контент, используйте режим 'a+'. Это откроет файл для добавления данных и позволит читать из него:
with open('filename.txt', 'a+') as file:
# Ваш код здесь
Таким образом, вы сможете добавлять данные к уже имеющемуся содержимому файла, не очищая его.
Как перенаправить вывод в файл и на экран (stdout)
UnicodeDecodeError: Кодек 'charmap' не может декодировать байт X в позиции Y: символ отображается как <неопределённый>
Правильный способ записи строки в файл?
Как открыть несколько файлов с помощью "with open" в Python?
Вывод строки в текстовый файл