Показать дерево путей с файлами

#python #path #tree

Вопрос:

 import os

path = "G:krunkermod"
abcde = open("path.txt", "w")

for dirpath, dirnames, filenames in os.walk(path):
    directory_level = dirpath.replace(path, "")
    directory_level = directory_level.count(os.sep)
    indent = " " * 4
    print("{}{}/".format(indent*directory_level, os.path.basename(dirpath)), file=abcde)

for f in filenames:
        print("{}{}".format(indent*(directory_level 1), f), file=abcde)

abcde.close()
 

Я хочу, чтобы он печатал файлы в каждой отдельной папке пути, но он печатает только в последней

Комментарии:

1. Это тот самый первоначальный отступ? for f in filenames: должен быть отступ, чтобы выполняться для каждой итерации цикла. Если в нем нет отступа, он будет выполнен только один раз после завершения цикла.

Ответ №1:

Отступ неправильный. Вторая for петля также должна находиться внутри первой for петли.

Правильный код:

 import os

path = "/home/user/my_folder/tools"
abcde = open("path.txt", "w")

for dirpath, dirnames, filenames in os.walk(path):
    directory_level = dirpath.replace(path, "")
    directory_level = directory_level.count(os.sep)
    indent = " " * 4
    print("{}{}/".format(indent*directory_level, os.path.basename(dirpath)), file=abcde)

    for f in filenames:
            print("{}{}".format(indent*(directory_level 1), f), file=abcde)

abcde.close()
 

Часть path.txt содержание:

 tools/
    .gitignore
    README.md
    __init__.py
    requirements3.txt
    test.py
    path.txt
    .git/
        description
        hooks/
            commit-msg.sample
        info/
            exclude
        refs/
            heads/
                master
 

Ответ №2:

Вы также можете использовать рекурсивную функцию, которая рекурсивно получает все содержимое подпапки до тех пор, пока не появится какая-либо подпапка:

 from os import walk

output = open("path.txt", "w")

def listFiles(path, indent):
    for (openedPath, folders, files) in walk(path):
        for file in files:
            output.write("t" * (indent)   file   "n")
        for folder in folders:
            output.write("t" * (indent)   folder   "/n")
            listFiles(path   "/"   folder, indent   1)
        break

source = "/my/path/to/my/folder"
print(source   "/")
listFiles(source, 1)
 

Вот пример с небольшой папкой проекта кода.

 /my/path/to/my/folder/
        input.txt
        main.py
        output/
                error.cpp
                trying.cpp
                logo.cpp
 

Ответ №3:

Вы можете использовать этот вид кода для упрощения

 import os
folder = r"C:pathtofindfiles"
x = [os.path.join(r,file) for r,d,f in os.walk(folder) for file in f # If you want specific files if file.endswith(".txt")]
y = [os.path.join(r,folder) for r,d,f in os.walk(folder) for folder in d]
print(x) #For files in main directory and subdirectories
print(y) #For files in main directory and subdirectories