Могу ли я использовать Python 3 'с open (имя файла, режим) в качестве файла:' и сохранить его в объекте для отправки событий? - PullRequest
2 голосов
/ 12 ноября 2019

Я пишу класс менеджера, который позволит создавать различные типы файлов журналов (raw, CSV, пользовательский формат данных), и я хотел бы оставить файл журнала открытым для записи строк по мере их поступления. Файл журнала также может быть запущен и остановлен событиями (нажатиями кнопок, условиями).

Я хочу знать, могу ли я объединить синтаксис with open('file') as file: с переменной экземпляра в классе - так что я незастрял опрос в цикле, пока файл открыт, но вместо этого может записать в файл по событию.

Я знаю, как использовать методы открытия и закрытия, но все говорят, что «с» гораздо надежнее и (более) обязательно записывают файл на диск.

Я хочу сделатьчто-то вроде этого:

class logfile:

    def __init__(self,filename,mode):
        with open(filename, mode) as self.f:
            return

    def write(self, input):
        self.f.write(input)

и используйте его следующим образом:

lf = logfile("junk.txt","wt")    # yeah, lf has to be global to use like this. Keeping demo simple here.

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

lf.write(dataline)

Затем я ожидаю, что все будет корректно закрыто, файл будет записан на диск при исчезновении lf - либо неявно при закрытии программы, либо явно, когда я установлю lf в None.

Когда я пытаюсь это сделать, файл (по-видимому) закрывается при возврате из создания lf. Я могу проверить lf и увидеть, что

lf.f == <_io.TextIOWrapper name='junk.txt' mode='wt' encoding='UTF-8'>

, но когда я пытаюсь использовать lf.write("text"), я получаю:

ValueError: I/O operation on closed file.

Есть ли способ использовать «с» и сохранить егов экземпляре?

Если это не удастся, я должен просто использовать open, close и write и убедиться, что у меня есть попытка / исключение / finally в init и закрытие в exit

...