递归列出Python中的所有文件,无法获取所有文件

递归列出Python中的所有文件,无法获取所有文件,python,recursion,Python,Recursion,我想递归地列出从我当前目录开始的所有文件。 我的目录结构: │ cat.py │ cat2.py │ du.py │ README.md.txt │ └───FirstInnerDirectory │ file.txt │ └───SecondInnerDirectory file2.txt 我的剧本: import os def list_content_recursively(start_point): prin

我想递归地列出从我当前目录开始的所有文件。 我的目录结构:

│   cat.py
│   cat2.py
│   du.py
│   README.md.txt
│
└───FirstInnerDirectory
    │   file.txt
    │
    └───SecondInnerDirectory
            file2.txt
我的剧本:

import os

def list_content_recursively(start_point):
    print("Call from: " + start_point)
    for entry in os.listdir(start_point):

        if os.path.isfile(entry):
            print("File: " + entry)

        elif os.path.isdir(entry):
            list_content_recursively(entry)

list_content_recursively(os.getcwd())
我的输出:

Call from: C:\Users\Username\Desktop\Programming\week02\03.Files
File: cat.py
File: cat2.py
File: du.py
Call from: FirstInnerDirectory
File: README.md.txt
我不知道为什么它不返回FirstInnerDirectory中的文件,并且它不将SecondInnerDirectory识别为dir obj。我还试图将条目更改为包含绝对路径,但仍然失败。

如果您这样做:

elif os.path.isdir(entry):
    list_content_recursively(entry)
entry
只是目录名,而不是完整路径。在递归调用函数时,还需要包含
起点

elif os.path.isdir(entry):
    list_content_recursively(os.path.join(start_point, entry))
这同样适用于:

if os.path.isfile(entry):
    ...
elif os.path.isdir(entry):
    ...
条目
也应该是完整路径,您应该使用
os.path.join(起始点,条目)
替换
条目
执行以下操作时:

elif os.path.isdir(entry):
    list_content_recursively(entry)
entry
只是目录名,而不是完整路径。在递归调用函数时,还需要包含
起点

elif os.path.isdir(entry):
    list_content_recursively(os.path.join(start_point, entry))
这同样适用于:

if os.path.isfile(entry):
    ...
elif os.path.isdir(entry):
    ...

条目
也应该是完整路径,您应该使用
os.path.join(起点,条目)
替换
条目
我想说的是,问题是您没有输入子目录。您真正想要的是
os.walk
,对于给定的目录和子目录,它递归地返回一个元组:

  • 当前目录
  • 当前目录中的目录
  • 当前目录中的文件
因此:

def列表内容(cwd、目录、文件):
打印(“来自:+cwd的呼叫”)
对于目录中的目录:
打印(“目录:”+目录)
对于文件中的文件:
打印(“文件:”+文件)
打印()
对于os.walk(os.getcwd())中的子目录:
列表内容(*子目录)
编辑: 我在发布后看到,您希望重新实现walk,因此这里的一些帮助是另一种实现方法:

导入操作系统
def list_content_递归():
cwd=os.getcwd()
打印(“来自:+cwd的呼叫”)
对于os.listdir(cwd)中的条目:
如果os.path.isfile(条目):
打印(“文件:+条目)
elif os.path.isdir(条目):
os.chdir(条目)
递归地列出内容
os.chdir(“…”)

如果你想从一个任意的地方开始,你也可以把它包装在一个函数中,这个函数以前做过一个
os.chdir
,否则abccd的答案仍然有效:)

我想说问题是你没有输入子目录。您真正想要的是
os.walk
,对于给定的目录和子目录,它递归地返回一个元组:

  • 当前目录
  • 当前目录中的目录
  • 当前目录中的文件
因此:

def列表内容(cwd、目录、文件):
打印(“来自:+cwd的呼叫”)
对于目录中的目录:
打印(“目录:”+目录)
对于文件中的文件:
打印(“文件:”+文件)
打印()
对于os.walk(os.getcwd())中的子目录:
列表内容(*子目录)
编辑: 我在发布后看到,您希望重新实现walk,因此这里的一些帮助是另一种实现方法:

导入操作系统
def list_content_递归():
cwd=os.getcwd()
打印(“来自:+cwd的呼叫”)
对于os.listdir(cwd)中的条目:
如果os.path.isfile(条目):
打印(“文件:+条目)
elif os.path.isdir(条目):
os.chdir(条目)
递归地列出内容
os.chdir(“…”)

如果您想从任意位置开始,您也可以将其包装在一个函数中,该函数以前执行过
os.chdir
,否则abccd的答案仍然有效:)

使用当前代码并尽可能少地修改:

import os


def list_content_recursively(start_point):
    print("Call from: " + start_point)

    for entry in os.listdir(start_point):

        full_path = os.path.join(start_point, entry)

        if os.path.isfile(full_path):
            print("File: " + entry)

        elif os.path.isdir(full_path):
            list_content_recursively(full_path)


list_content_recursively(os.getcwd())

正如您所看到的,当沿着文件路径跟踪文件时,您需要完整的路径。

使用当前代码并尽可能少地修改:

import os


def list_content_recursively(start_point):
    print("Call from: " + start_point)

    for entry in os.listdir(start_point):

        full_path = os.path.join(start_point, entry)

        if os.path.isfile(full_path):
            print("File: " + entry)

        elif os.path.isdir(full_path):
            list_content_recursively(full_path)


list_content_recursively(os.getcwd())

如您所见,在沿着文件路径跟踪文件时,您需要完整路径。

您的修改版本,使用
pathlib
,并将绝对路径传递给
isfile
isdir

import os
import pathlib

def list_content_recursively(start_point):
    print("Call from: " + str(start_point))

    for entry in os.listdir(start_point):

        entry_path = pathlib.Path(start_point) / entry

        if os.path.isfile(entry_path):
            print("File: " + str(entry))

        if os.path.isdir(entry_path):
            list_content_recursively(entry_path)

list_content_recursively(pathlib.Path('.'))

您的修改版本,使用
pathlib
,并将绝对路径传递到
isfile
isdir

import os
import pathlib

def list_content_recursively(start_point):
    print("Call from: " + str(start_point))

    for entry in os.listdir(start_point):

        entry_path = pathlib.Path(start_point) / entry

        if os.path.isfile(entry_path):
            print("File: " + str(entry))

        if os.path.isdir(entry_path):
            list_content_recursively(entry_path)

list_content_recursively(pathlib.Path('.'))

你是想重新发明
os.walk()
?重新发明不是一个确切的词,我只是想实现它的一部分以便更好地理解。你是想重新发明
os.walk()
?重新发明不是一个确切的词,我只是想实现它的一部分以便更好地理解。非常感谢约书亚:)非常感谢约书亚:)