Я пишу класс менеджера, который позволит создавать различные типы файлов журналов (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