Есть ли способ эффективно получить каждый файл в каталоге, содержащем миллионы файлов?

Я знаю os.listdir , но насколько Я могу собрать, который получает все имена файлов в каталоге в память, а затем возвращает список. Я хочу получить способ получить имя файла, поработать с ним, а затем передать следующее, не считывая их все в память.

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

Потенциально может быть несколько случаев, которые могут вызвать отказ итератора, и все зависит от того, как итератор поддерживает состояние. Используя пример S.Lotts:

filea.txt
fileb.txt
filec.txt

Итератор возвращает filea.txt . Во время обработки , filea.txt переименовывается в filey.txt , а fileb.txt переименовывается в filez.txt . Когда итератор пытается получить следующий файл, если он использует имя файла filea.txt , чтобы найти его текущую позицию, чтобы найти следующий файл, а filea.txt - нет. там, что бы случилось? Возможно, ему не удастся восстановить свое положение в коллекции. Аналогично, если бы итератор получил fileb. txt при выдаче filea.txt он мог найти позицию fileb.txt , выйти из строя и выдать ошибку.

Если бы итератор вместо этого мог каким-то образом поддерживать индекс dir.get_file (0) , то это не повлияло бы на поддержание позиционного состояния, но некоторые файлы могли бы быть пропущены, поскольку их индексы могли быть перемещены в индекс "позади" итератора.

Это все, конечно, теоретически, поскольку, похоже, нет встроенного (python) способа перебора файлов в каталоге. Однако ниже есть несколько отличных ответов, которые решают проблему с помощью очередей и уведомлений.

Изменить:

ОС, вызывающая озабоченность, - Redhat. Мой вариант использования таков:

Процесс A непрерывно записывает файлы в место хранения. он мог найти позицию fileb.txt , выйти из строя и выдать ошибку.

Если бы итератор вместо этого мог каким-то образом поддерживать индекс dir.get_file (0) , то это не повлияло бы на поддержание позиционного состояния, но некоторые файлы могли бы быть пропущены, поскольку их индексы могли быть перемещены в индекс «позади» итератора.

Все это, конечно, теоретически, поскольку, похоже, нет встроенного (python) способа перебора файлов в каталоге. Однако ниже есть несколько отличных ответов, которые решают проблему с помощью очередей и уведомлений.

Изменить:

ОС, вызывающая озабоченность, - Redhat. Мой вариант использования таков:

Процесс A непрерывно записывает файлы в место хранения. он мог найти позицию fileb.txt , выйти из строя и выдать ошибку.

Если бы итератор вместо этого мог каким-то образом поддерживать индекс dir.get_file (0) , то это не повлияло бы на поддержание позиционного состояния, но некоторые файлы могли бы быть пропущены, поскольку их индексы могли быть перемещены в индекс "позади" итератора.

Это все, конечно, теоретически, поскольку, похоже, нет встроенного (python) способа перебора файлов в каталоге. Однако ниже есть несколько отличных ответов, которые решают проблему с помощью очередей и уведомлений.

Изменить:

ОС, вызывающая озабоченность, - Redhat. Мой вариант использования таков:

Процесс A непрерывно записывает файлы в место хранения.

Если бы итератор вместо этого мог каким-то образом поддерживать индекс dir.get_file (0) , то это не повлияло бы на поддержание позиционного состояния, но некоторые файлы могли бы быть пропущены, поскольку их индексы могли быть перемещены в индекс «позади» итератора.

Все это, конечно, теоретически, поскольку, похоже, нет встроенного (python) способа перебора файлов в каталоге. Однако ниже есть несколько отличных ответов, которые решают проблему с помощью очередей и уведомлений.

Изменить:

ОС, вызывающая озабоченность, - Redhat. Мой вариант использования таков:

Процесс A непрерывно записывает файлы в место хранения.

Если бы итератор вместо этого мог каким-то образом поддерживать индекс dir.get_file (0) , то это не повлияло бы на поддержание позиционного состояния, но некоторые файлы могли бы быть пропущены, так как их индексы могли быть перемещены в индекс "позади" итератора.

Это все, конечно, теоретически, поскольку, похоже, нет встроенного (python) способа перебора файлов в каталоге. Однако ниже есть несколько отличных ответов, которые решают проблему с помощью очередей и уведомлений.

Изменить:

ОС, вызывающая озабоченность, - Redhat. Мой вариант использования таков:

Процесс A непрерывно записывает файлы в место хранения. итератор.

Все это, конечно, теоретически, поскольку, похоже, не существует встроенного (python) способа итерации по файлам в каталоге. Однако ниже есть несколько отличных ответов, которые решают проблему с помощью очередей и уведомлений.

Изменить:

ОС, вызывающая озабоченность, - Redhat. Мой вариант использования таков:

Процесс A непрерывно записывает файлы в место хранения. итератор.

Все это, конечно, теоретически, поскольку, похоже, не существует встроенного (python) способа итерации по файлам в каталоге. Однако ниже есть несколько отличных ответов, которые решают проблему с помощью очередей и уведомлений.

Изменить:

ОС, вызывающая озабоченность, - Redhat. Мой вариант использования таков:

Процесс A непрерывно записывает файлы в место хранения. Процесс B (тот, который я пишу) будет перебирать эти файлы, выполняя некоторую обработку на основе имени файла и перемещая файлы в другое место.

Изменить:

Определение действительного:

Прилагательное 1. Хорошо обоснованный или оправданный, уместный.

(Извините, С.Лотт, я не смог устоять).

Я отредактировал упомянутый выше абзац.

12
задан Josh Smeaton 23 February 2011 в 23:23
поделиться