簡體   English   中英

遞歸列出Python中的所有文件,但無法全部獲取

[英]Recursively listing all files in Python, not able to fetch all

我想遞歸地列出從當前目錄開始的所有文件。 我的目錄結構:

│   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。 我還嘗試將條目更改為包括絕對路徑,但仍然失敗。

使用當前代碼並進行盡可能少的修改:

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

如您所見,沿着文件路徑跟蹤文件時,需要完整路徑。

當您這樣做時:

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

您的修改版本,使用pathlib ,並將絕對路徑傳遞給isfileisdir

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.walkos.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的答案仍然有效:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM