Сканирование и просмотр файлов рекурсивно без os.walk () - PullRequest
0 голосов
/ 11 апреля 2020

Я новичок в программировании и уже около месяца изучаю Python как мой первый язык в области информационной безопасности. В ходе курса я получил указание создать файловую структуру, которая рекурсивно перечисляет файлы: он упомянул fnmatch и glob. После прочтения документации и просмотра форумов я пришёл к этому (пожалуйста, несите мой щедрый отладочный код):

import os
import fnmatch

def tree(path = ""):
    print(path)
    level = 1
    separator = "----" * level
    for file in os.listdir("." + path):
        print("Scanning files in " + path)
        print(os.listdir("." + path))

        if os.path.isfile(file):
            print("file found! It's called " + file)
            print(separator + file)
        elif os.path.isdir(file):
            print("dir found! It's called " + file)
            print(separator + file)
            level += 1
            print("Entering directory...")
            tree("/" + file)
        else:
            print(file + " is corrupted or of an unknown format.")

tree()

Вывод был:

Scanning files in 
['example.py', 'NewDirectory', 'NewDirectory - Shortcut.lnk', 'spse2.txt']
file found! It's called example.py
----example.py
Scanning files in 
['example.py', 'NewDirectory', 'NewDirectory - Shortcut.lnk', 'spse2.txt']
dir found! It's called NewDirectory
----NewDirectory
Entering directory...
/NewDirectory
Scanning files in /NewDirectory
['folder', 'samplefile.txt']
folder is corrupted or of an unknown format.
Scanning files in /NewDirectory
['folder', 'samplefile.txt']
samplefile.txt is corrupted or of an unknown format.
Scanning files in 
['example.py', 'NewDirectory', 'NewDirectory - Shortcut.lnk', 'spse2.txt']
file found! It's called NewDirectory - Shortcut.lnk
----NewDirectory - Shortcut.lnk
Scanning files in 
['example.py', 'NewDirectory', 'NewDirectory - Shortcut.lnk', 'spse2.txt']
file found! It's called spse2.txt
----spse2.txt

Не могу войти в папку «папка». Что мне здесь делать?

Спасибо.

1 Ответ

0 голосов
/ 12 апреля 2020

О вашем коде:

Ваша рекурсия не принимает level в качестве аргумента, поэтому вы увеличиваете ее без результатов (как видно из вашего вывода). [Говоря о '---', '-----' incremental]

Здесь я немного переработал ваш код:

def tree(path='.', level=1):
    #print(path)
    #level=1
    separator = "----" * level
    #print("Scanning files in " + path)
    #print(f"content: {os.listdir(path)}")
    for each_item in os.listdir(path):
      #print('Checking item ',each_item)
      if os.path.isfile(path+f'/{each_item}'):
        #print("file found! It's called " + each_item)
        print(separator + each_item)
        pass
      elif os.path.isdir(path+f'/{each_item}'):
        #print("directory found! It's called " + each_item)
        print(separator + each_item)
        level+=1
        #print(f"Entering directory...{each_item}")
        tree(path+f'/{each_item}', level)
      else:
        print(f"{each_item} is corrupted or of an unknown format.")

tree()

Прокомментировал большинство отпечатков из функции, оставив вывод:

----Folder
------------example.py
------------NewDirectory
----------------samplefile.txt
----------------folder
--------------------root.txt
------------NewDirectory - Shortcut.lnk
----initial.py

Проверьте онлайн-компилятор.

Одна заметка о рекурсии со значениями по умолчанию (значение по умолчанию def function (argument=10)), вы должны проверить эту статью .

На секунду обратите внимание, относительно fnmatch и glob (а не os.walk из заголовка).

Для определенной структуры, как ваша, вы можете использовать fnmatch, чтобы найти файлы с python (py) как расширение (python файлов). Или тексты (txt) и т. Д.:

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.py'):
        print(file)

Создан базовый c пример этого дубля внутри ссылки компилятора (проверьте файл main2.py).

На третьем замечании , проверьте эту константу Path из библиотеки pathlib :

from pathlib import Path

for path in Path('.').rglob('*'):
    print(path.name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...