Есть ли простой способ автоматизировать отслеживание файлов, созданных и сохраненных в python? - PullRequest
2 голосов
/ 04 ноября 2019

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

Спасибо за вашу помощь

Редактировать: Или любой альтернативный способ ведения журнала входов и выходов.

1 Ответ

1 голос
/ 04 ноября 2019

Вот оболочка для тонких объектов вокруг функции open, которая отслеживает все открываемые файлы.

class Open:
    _open = open
    def __init__(self):
        self.opened_files = []
        self.fp = None

    def __call__(self,
                 file,
                 mode='r',
                 buffering=-1,
                 encoding=None,
                 errors=None,
                 newline=None,
                 closefd=True,
                 opener=None):

        self.fp = self._open(file, mode, buffering, encoding, errors,
            newline, closefd, opener)
        self.opened_files.append((mode, file))
        return self.fp

    def __enter__(self, *args, **kwargs):
        return self.__call__(*args, **kwargs)

    def __exit__(self, *exc_details):
        return self.fp.close()

    def __getattr__(self, attr):
        return getattr(self.fp, attr)

    def export(self, filename):
        with open(filename, 'w') as fp:
            for m, fn in self.opened_files:
                fp.write(f'({m}): {fn}\n')

Чтобы использовать ее, вам нужно перезаписать встроенную open функция с экземпляром этого класса. Если у вас есть один файл, который вы вызываете, вы можете вставить его в блок __main__. т.е.

...

if __name__=='__main__':
   # code defining Open class here
   ...
   open = Open()
   # other code in __main__ here

   open.export("IO_track_scriptname_date_time.txt")
...