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

时间:2019-08-06 11:34:08

标签: 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:
            files.append(os.path.abspath(item))
        else:
            files.extend(recur_files(os.path.abspath(item)))
    os.chdir(original_path)
    return files

3 个答案:

答案 0 :(得分:1)

示例:

from os import walk

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

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

答案 1 :(得分:0)

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

import org.apache.spark.sql.functions._
dataFrame
   .withColumn("Date", to_date(from_unixtime(col("pro_rtc"))))
   .withColumn("Monday", expr("date_sub(Date, dayofweek(Date) - 2)"))

答案 2 :(得分:0)

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

但是,如果要创建自己的函数,则需要目录列表。循环应该从该列表中获取目录名,并且应该向该列表中添加新目录,而不是使用新的start_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('.')