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

时间:2018-03-28 05:34:37

标签: 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):
    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。我还尝试更改条目以包含绝对路径,但它仍然失败。

4 个答案:

答案 0 :(得分:4)

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

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())

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

答案 1 :(得分:1)

当你这样做时:

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

entry只是目录名,而不是它的完整路径。在递归调用函数时,还需要包含start_point

elif os.path.isdir(entry):
    list_content_recursively(os.path.join(start_point, entry))

同样适用:

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

entry也应该是完整路径,您应该使用os.path.join(start_point, entry)来替换entry

答案 2 :(得分:0)

您的修改后的版本,使用Map<String, String> logins = new HashMap<String, String>(); logins.put("graph.facebook.com", AccessToken.getCurrentAccessToken().getToken()); credentialsProvider.setLogins(logins); credentialsProvider.refresh(); ,并将绝对路径传递给pathlibisfile

isdir

答案 3 :(得分:-1)

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

  • 当前目录
  • 当前目录中的目录
  • 当前目录中的文件

因此:

def list_content(cwd, directories, files):
     print("Call from: " + cwd)
     for directory in directories:
        print("Directory:" + directory)
     for file in files:
        print("File: " + file)
     print()

for subdir in os.walk(os.getcwd()):
     list_content(*subdir)

修改 我在发帖后看到你想重新实现步行,所以这里的一些帮助是另一种方法:

import os

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

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

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

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