Я знаю 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, я не удержался).
Я редактировал данный параграф выше.