Сохранение файла без его закрытия в Python - PullRequest
0 голосов
/ 05 ноября 2018

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

file_list = ['f1', 'f2', 'f3', 'f4']
report  = "C:/reports/report_%s"%(timestamp)
r = open(report, "w')

Что произойдет, если в f3 произойдет что-то, что приведет к сбою скрипта до его завершения. Я могу использовать try-catch для обработки ошибки, но я не хочу просто закрывать отчет. Возможно, я хочу продолжить сценарий. Возможно, во время работы сценария происходит сбой питания. Возможно, есть несколько try-catch операторов, и я не хочу закрывать для каждой ошибки. По сути, я просто хочу сохранить файл, не закрывая его на каждой итерации списка, чтобы в случае сбоя я мог получить данные, записанные в отчет, вплоть до этого момента. Как я могу это сделать? Я не могу просто сделать report.save(), верно? Я думал об использовании flush() с os.fsync(), как объяснено в другом вопросе , но я не уверен на 100%, что применимо к моему сценарию. Любое предложение о том, как достичь моей цели здесь?

try:
    ....do stuff...
    report.write(<stuff_output> + "\n")
    try:
        ....do more stuff....
        report.write(<stuff_output> + "\n")
    except:
        continue
    report.close()
except Exception as e:
    pass

1 Ответ

0 голосов
/ 05 ноября 2018

Кажется, я смог решить эту проблему, просто используя flush() и os.fsync() в правильной области и поместив r.close() вне попытки. Таким образом, даже если он пытается и терпит неудачу, он проходит или продолжает и в конце закрывается:

try:
    for item in file_list:
        try:
            r.write("This is item: " + item + "\n")

        except:
            r.flush()
            os.fsync(r)
            continue

except Exception as e:
    pass

r.close()

Это всегда выдает "This is item: f1", "This is item: f2", "This is item: f3" в отчет.

...