【问题标题】:Scanning and listing files recursively without os.walk()在没有 os.walk() 的情况下递归地扫描和列出文件
【发布时间】:2020-04-11 18:58:57
【问题描述】:

我是编程新手,并且已经学习了大约一个月的 Python 作为我进入信息安全领域的第一语言。在课程中,我被指示构建一个文件结构,以递归方式列出文件,如下所示:

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

讲师似乎暗示我不需要使用递归函数,但他确实提到了 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

似乎无法进入文件夹“文件夹”。我应该在这里做什么?

谢谢。

【问题讨论】:

  • 如果您将def tree(path = "") 替换为def tree(path) 并通过tree("Folder") 运行(代码底部),它可以工作吗?
  • “文件夹”实际上被称为“Python Pentesting”,所以我对其进行了更改并实施了您的更改,但是当“。”时,我确实在第 8 行得到了错误。连接到路径。另外,我尝试将完整路径放在tree() 中,例如tree("C:\Users\Adrian\Desktop\Infosec\Notes\Python Pentesting"),但这给了我一个语法错误。

标签: python-3.x recursion directory


【解决方案1】:

关于您的代码:

您的递归没有将level 作为参数,因此您在没有结果的情况下递增它(如您的输出所示)。[谈论'---','-----' 递增]

在这里我重构了一点你的代码:

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

Check online compiler.

关于使用默认值的递归(默认含义 def function (argument=10))的注意事项,您应该检查 this article out

第二点,关于fnmatchglob(而不是标题中的os.walk)。

对于您定义的结构,您可以使用fnmatch 查找以python (py) 作为扩展名的文件(python 文件)。或文本(txt)等:

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

在编译器链接中创建了一个基本示例(检查main2.py 文件)。

第三点,检查 pathlib 库中的这个 Path 常量:

from pathlib import Path

for path in Path('.').rglob('*'):
    print(path.name)

【讨论】:

    猜你喜欢
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多