Мне известно о 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)
, то поддержание позиционного состояния не будет затронуто, но некоторые файлы могут быть пропущены, так как их индексы могут быть перемещены в индекс «позади»iterator.
Это, конечно, теоретически, поскольку, похоже, нет никакого встроенного (python) способа перебора файлов в каталоге.Ниже приведены некоторые отличные ответы, которые решают проблему с помощью очередей и уведомлений.
Редактировать:
Операционная система Redhat.Мой пример использования такой:
Процесс A непрерывно записывает файлы в хранилище.Процесс B (тот, который я пишу) будет перебирать эти файлы, выполнять некоторую обработку на основе имени файла и перемещать файлы в другое место.
Редактировать:
Определениедействительный:
Прилагательное 1. Хорошо обосновано или оправдано, уместно.
(Извините, С.Лотт, я не смог устоять).
Я редактировал абзац ввопрос выше.