Я знаю, что мы можем использовать os.walk()
для вывода списка всех подкаталогов или всех файлов в каталоге. Однако я хотел бы перечислить полное содержимое дерева каталогов:
- Subdirectory 1:
- file11
- file12
- Sub-sub-directory 11:
- file111
- file112
- Subdirectory 2:
- file21
- sub-sub-directory 21
- sub-sub-directory 22
- sub-sub-sub-directory 221
- file 2211
Как лучше всего добиться этого на Python?
ValueError: zero length field name in format
выбрасывается.root.replace(startpath, '', 1)
должно исправить этоПодобно ответам выше, но для python3, возможно, читаемый и, возможно, расширяемый:
Пример использования:
Пример вывода:
Ноты
Редактировать:
источник
Решение без вашего отступа:
os.walk уже выполняет ту прогулку сверху вниз, в первую очередь в глубину, которую вы ищете.
Игнорирование списка каталогов предотвращает указанное вами перекрытие.
источник
NameError: name 'path' is not defined
Обычно мы предпочитаем просто использовать дерево GNU, но мы не всегда используем его
tree
в каждой системе, и иногда доступен Python 3. Хороший ответ здесь можно легко скопировать и не делатьtree
требования GNU .tree
вывод выглядит так:Я создал указанную выше структуру каталогов в моем домашнем каталоге в каталоге, который я называю
pyscratch
.Я также вижу здесь другие ответы, которые подходят к такому виду вывода, но я думаю, что мы можем добиться большего, используя более простой и современный код и лениво оценивая подходы.
Дерево в Python
Для начала воспользуемся примером, который
Path
объект Python 3yield
иyield from
выражение (которые создают функцию генератора)и сейчас:
печатает:
Нам действительно нужно материализовать каждый каталог в список, потому что нам нужно знать, сколько он длится, но после этого мы выбрасываем список. Для глубокой и широкой рекурсии это должно быть достаточно ленивым.
Приведенного выше кода с комментариями должно быть достаточно, чтобы полностью понять, что мы здесь делаем, но не стесняйтесь выполнять его с помощью отладчика, чтобы лучше его обработать, если вам нужно.
Больше возможностей
Теперь GNU
tree
дает нам несколько полезных функций, которые я хотел бы иметь с помощью этой функции:n directories, m files
-L level
-d
Кроме того, когда есть огромное дерево, полезно ограничить итерацию (например, с помощью
islice
), чтобы избежать блокировки вашего интерпретатора текстом, поскольку в какой-то момент вывод становится слишком подробным, чтобы быть полезным. Мы можем сделать это произвольно высоким по умолчанию, скажем1000
.Итак, давайте удалим предыдущие комментарии и заполним эту функцию:
И теперь мы можем получить такой же результат, как
tree
:печатает:
А мы можем ограничиться уровнями:
печатает:
И мы можем ограничить вывод каталогами:
печатает:
Ретроспектива
Оглядываясь назад, мы могли бы использовать
path.glob
для сопоставления. Мы могли бы также использоватьpath.rglob
для рекурсивной подстановки, но это потребует переписывания. Мы также могли бы использоватьitertools.tee
вместо материализации список содержимого каталогов, но это может иметь отрицательные компромиссы и, вероятно, сделает код еще более сложным.Комментарии приветствуются!
источник
elif not limit_to_directories:
добавьте следующее:info = prefix + pointer + path.name; try: with path.open('r') as f: n_lines = len(f.readlines()); loc = f' LOC: {n_lines}'; info += loc; except UnicodeDecodeError: pass; yield info
См. Эту ссылку для правильного белого пространства.contents
нужно фильтровать, еслиlimit_to_directories
True. В противном случае, если в папке нет каталога для последнего файла, дерево будет нарисовано неправильно.if limit_to_directories: contents = [path for path in contents if path.is_dir()]
list(dir_path.iterdir())
возврате правильно упорядоченного нисходящего дерева структуры каталогов. Я не вижу такой гарантии в API для iterdir () . Пожалуйста, дайте ссылку на то, какiterdir()
заказывает или гарантированно обеспечит желаемый заказ.os.listdir()
она используется по умолчанию - что не дает гарантии порядка : «Список находится в произвольном порядке и не включает специальные записи». и '..', даже если они присутствуют в каталоге ».Я пришел сюда в поисках того же и использовал для себя ответ dhobbs. Как способ поблагодарить сообщество, я добавил несколько аргументов для записи в файл, как просил Акшай, и сделал отображение файлов необязательным, поэтому это не так уж и важно. Также сделал отступ в качестве необязательного аргумента, чтобы вы могли его изменить, так как некоторым нравится значение 2, а другим - 4.
Использовались разные циклы, поэтому тот, который не показывает файлы, не проверяет, нужно ли это делать на каждой итерации.
Надеюсь, это поможет кому-то другому, поскольку ответ dhobbs помог мне. Большое спасибо.
источник
На основе этого фантастического поста
http://code.activestate.com/recipes/217212-treepy-graphically-displays-the-directory-structur/
Здесь есть усовершенствование, чтобы вести себя точно так же, как
http://linux.die.net/man/1/tree
источник
Если кому-то интересно - та рекурсивная функция возвращает вложенную структуру словарей. Ключи - это
file system
имена (каталогов и файлов), значения либо:file_token
)В этом примере строки, обозначающие файлы, пусты. Им также может быть, например, предоставлено содержимое файла или информация о его владельце или привилегии или любой другой объект, отличный от dict. Если это не словарь, его можно легко отличить от "типа каталога" в дальнейших операциях.
Наличие такого дерева в файловой системе:
Результат будет:
Если вам это нравится, я уже создал пакет (python 2 и 3) с этим материалом (и хорошим
pyfakefs
помощником): https://pypi.org/project/fsforge/источник
В дополнение к ответу dhobbs выше ( https://stackoverflow.com/a/9728478/624597 ), вот дополнительная функция сохранения результатов в файл (я лично использую его для копирования и вставки в FreeMind, чтобы иметь хороший обзор структура, поэтому я использовал табуляцию вместо пробелов для отступов):
источник
Вы можете выполнить команду tree в оболочке Linux.
Монтаж:
Использование в Python
Пример:
Это дает вам более чистую структуру, визуально более полный и простой для набора текста.
источник
Это решение будет работать, только если вы
tree
установили его в своей системе. Однако я оставляю это решение здесь на всякий случай, если оно поможет кому-то другому.Вы можете указать дереву выводить древовидную структуру как XML (
tree -X
) или JSON (tree -J
). Разумеется, JSON можно анализировать напрямую с помощью Python, а XML можно легко читатьlxml
.На примере следующей структуры каталогов:
XML
JSON
источник
Может быть, быстрее, чем @ellockie (Может быть)
Результаты теста на скриншоте ниже:
источник
Здесь вы можете найти код с таким выводом: https://stackoverflow.com/a/56622847/6671330
источник
Для тех, кто все еще ищет ответ. Вот рекурсивный подход для получения путей в словаре.
источник
Ответ @dhobbs отличный!
но просто измените, чтобы легко получить информацию об уровне
и вывод вроде
вы можете получить уровень по
|
счету!источник