Добавить в файл, только если он уже существует - PullRequest
1 голос
/ 14 января 2020

В начале моего сценария ожидается, что файл script.log существует и к нему добавляются сообщения. Но если файл не существует (пользователь решил удалить файл), файл не должен быть создан заново, вместо этого сообщения будут напечатаны в stdout. Заполните ведро, только если вы его видите.

Как это сделать? У множества людей, должно быть, была похожая проблема, но я не мог найти никакого решения.


Я нацелился на что-то вроде следующего кода, но режим добавления не вызывает никаких исключений, когда файл не найден :
try:
    with open('script.log', 'a') as f:
        f.write('foo')
except FileNotFoundError:
    print('foo')

Я знаю, что следующий код должен работать, но в идеале я бы хотел его избежать, поскольку он содержит условие гонки :

if os.path.exists('script.log'):
    with open('script.log', 'a') as f:
        f.write('foo')
else:
    print('foo')

1 Ответ

1 голос
/ 14 января 2020

Используйте os.open и os.fdopen отдельно, а не open.

Режим "a", используемый open, пытается открыть файл с помощью флагов os.O_APPEND и os.O_CREAT, создание файла, если он еще не существует. Мы будем использовать os.fdopen, чтобы использовать просто флаг os.O_APPEND, вызывая повышение FileNotFoundError, если он еще не существует.

Предполагая, что это успешно, мы ' Я буду использовать os.fdopen, чтобы обернуть дескриптор файла, возвращаемый fdopen, в подобный файлу объект. (К сожалению, для этого требуется, казалось бы, избыточный флаг "a".)

import os
import sys

try:
    fd = os.open('script.log', os.O_APPEND)
    with os.fdopen(fd, "a") as f:
        f.write("foo")
except FileNotFoundError:
    print("foo")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...