Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使此文件功能非递归?_Python_File_Recursion_Directory_Operating System - Fatal编程技术网

Python 如何使此文件功能非递归?

Python 如何使此文件功能非递归?,python,file,recursion,directory,operating-system,Python,File,Recursion,Directory,Operating System,这是一个函数,它列出了当前文件夹中的所有文件以及递归的子文件夹,我不能非递归地编写它 我尝试使用嵌套格式的while和for循环,但无法使其工作 def recur_files(start_dir): files = [] original_path = os.getcwd() os.chdir(start_dir) items = os.listdir() for item in items: if "." in item:

这是一个函数,它列出了当前文件夹中的所有文件以及递归的子文件夹,我不能非递归地编写它

我尝试使用嵌套格式的while和for循环,但无法使其工作

def recur_files(start_dir):
    files = []
    original_path = os.getcwd()
    os.chdir(start_dir)
    items = os.listdir()
    for item in items:
        if "." in item:
            files.append(os.path.abspath(item))
        else:
            files.extend(recur_files(os.path.abspath(item)))
    os.chdir(original_path)
    return files

示例:

from os import walk

files = []
for _, _, filenames in walk(your_path):
    files.extend(filenames)
print("Files: {}".format(files))

您可以递归地获取路径中的所有文件

如果希望以深度优先搜索方式列出文件,而不使用程序堆栈(也称为递归),则始终可以创建自己的堆栈(只是Python中的列表),并编写一个简单的DFS算法,如下所示

import os


def recur_files():
    original_path = os.getcwd()
    stack = os.listdir()
    results = []

    for item in stack:
        os.path.join(original_path, item)

    while stack:
        elem = stack.pop(0)
        if os.path.isdir(elem):
            results.append(elem)
            for item in os.listdir(elem):
                stack = [os.path.join(elem, item)] + stack
        else:
            results.append(elem)

    return results
您可以使用
os.walk()
获取文件夹和子文件夹中的所有文件

但若你们想创建自己的函数,那个么你们需要dirs的列表。循环应该从此列表中获取dirname,您应该将新dir添加到此列表中,而不是使用new
start\u dir运行函数

import os

def recur_files(start_dir):
    files = []
    dirs = [start_dir]

    for dirname in dirs:
        for item in os.listdir(dirname):

            fullpath = os.path.join(dirname, item)

            if os.path.isdir(fullpath): #and fullpath not in ('.', '..'):
                dirs.append(fullpath)
            else:
                files.append(fullpath)

    return files, dirs

recur_files('.')

使用
os.walk()
获取文件夹和子文件夹中的所有文件。若要使其无递归(且无os.walk),您必须使用目录列表,并使用从该列表获取目录名的循环。若它找到了子文件夹,那个么它会将dirname添加到这个列表中,下次循环应该会从列表中获取它。非常感谢。它满足了我的目的。非常感谢,非常感谢!这教会了我如何处理递归函数。非常感谢。非常有用。我将使用os.walk()。我还学会了将递归函数转换为非递归函数。