Запись каждого элемента в файл в долго работающем скрипте Python?

#python-3.x #list #file

#python-3.x #Список #файл

Вопрос:

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

 file_tuple = (fullpath ; filename ; filesize ; some_meta ; hash)
 

Я хочу иметь все кортежи в одном file_list и, наконец, в файле.

Мой скрипт работает для небольших папок, но если я запускаю его на всем диске, что бы ни случилось (ошибка памяти, ошибка операционной системы, выполняется вечно, требуется перезапуск ядра и т. Д.), Вся «работа» теряется.

Поэтому я хочу иметь возможность сохранять результаты, как только какой-либо файл прошел процесс. Если сценарий по какой-либо причине прерывается, я могу просто начать с момента последнего сбоя.

Решение, которое я имел в виду, состоит в том, чтобы поместить в цикл в псевдокоде:

  • открыть файл
  • напишите 1 строку
  • закрыть файл

Нравится:

 with open('Files.txt', 'w') as f:
    f.write(file_tuple   'n')
 

Это хорошее решение или я упускаю какую-то большую концепцию (любитель здесь)?

Ответ №1:

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

  • вам нужно будет открыть файл в 'a' режиме (добавления), иначе каждое открытие уничтожит предыдущее содержимое
  • file_tuple 'n' вероятно, это не сработает, потому что кортеж не является строкой; вам понадобится что-то вроде f.write(f"{file_tuple}n") .

Существует вероятность того, что открытие и закрытие файла будет медленным, но это зависит от операционной системы и других функций, выполняемых вашей программой — вы должны измерить это. Если это слишком медленно, то вы, вероятно, захотите открыть файл только один раз и только write() кортеж.

Комментарии:

1. Спасибо. Это с file_tuple ‘n’ не так важно. Это техническая деталь. Я бы это понял. Это был скорее концептуальный вопрос, и вы ответили на него. Также спасибо за технические детали при записи в файл.