Я знаю os.listdir
, но, насколько я могу судить, он получает все имена файлов в каталоге в память и затем возвращает список. То, что я хочу, - это способ дать имя файла, работать над ним, а затем дать следующий, не читая их все в памяти.
Есть ли способ сделать это? Я беспокоюсь о том, где имена файлов меняются, новые файлы добавляются, и файлы удаляются с использованием такого метода. Некоторые итераторы не позволяют вам изменять коллекцию во время итерации, в основном, делая снимок состояния коллекции в начале и сравнивая это состояние с каждой операцией move
. Если есть итератор, способный давать имена файлов из пути, вызывает ли он ошибку, если есть изменения в файловой системе (добавление, удаление, переименование файлов в итерированном каталоге), которые изменяют коллекцию?
Возможно, может быть несколько случаев, которые могут привести к сбою итератора, и все зависит от того, как итератор поддерживает состояние. Использование примера S.Lotts:
filea.txt
fileb.txt
filec.txt
Итератор дает filea.txt
. Во время processing
, filea.txt
переименовывается в filey.txt
, а fileb.txt
переименовывается в filez.txt
. Когда итератор пытается получить следующий файл, если он должен использовать имя файла filea.txt
, чтобы найти его текущую позицию, чтобы найти следующий файл, а filea.txt
- нет, что произойдет? Возможно, он не сможет восстановить эту позицию в коллекции. Точно так же, если итератор должен был получить fileb.txt
при получении filea.txt
, он мог бы искать положение fileb.txt
, терпеть неудачу и вызывать ошибку.
Если вместо этого итератор смог каким-то образом поддерживать индекс dir.get_file(0)
, то сохранение состояния позиционирования не будет затронуто, но некоторые файлы могут быть пропущены, так как их индексы могут быть перенесены в индекс "позади" итератора.
Это все теоретически, конечно, поскольку, похоже, нет встроенного (python) способа повторения файлов в каталоге. Однако есть несколько отличных ответов, которые решают проблему, используя очереди и уведомления.
Edit:
ОС беспокойства - Редхат. Моим вариантом использования является следующее:
Процесс A непрерывно записывает файлы в хранилище. Процесс B (тот, который я пишу), будет итерировать эти файлы, выполнять некоторую обработку на основе имени файла и перемещать файлы в другое место.
Edit:
Определение действительного:
Прилагательное 1. Хорошо обоснованные или обоснованные, соответствующие.
(Извините S.Lott, я не удержался).
Я редактировал данный параграф выше.