【问题标题】:Recursively execute a Python program in all subfolders在所有子文件夹中递归执行 Python 程序
【发布时间】:2017-11-09 10:01:28
【问题描述】:

我有一个程序可以读取目录中所有带有“.txt”扩展名的文件,并对这些文件中写入的数字进行操作。程序是这样的:

   import glob
   list_of_files = glob.glob("*.txt")
   for filename in list_of_files:
       p,j, x = open(filename, "r") 
       #do things

例如,我可以将文件夹中所有文件的所有 p 相加。问题是我有许多具有相同结构的文件夹,并且在每个文件夹中我都需要运行相同的程序。由于我不想在每个文件夹中复制粘贴 python 程序然后运行它,所以我正在寻找一种递归方式。

我发现 python 有一个名为 os 的库可以提供帮助:

  for root, dirs, files in os.walk(path):
      for name in files:
       #do things

问题是我不知道如何确保程序对每个文件夹都执行一次,而且我担心这样做我可能会同时考虑所有子文件夹中的所有文件,而我需要分别处理每个文件夹中的所有文件......换句话说,我需要类似的东西:

  for root, dirs in os.walk(path):
      for files in dirs:
          glob.glob("*.txt)
          #do things

【问题讨论】:

  • 你尝试过实际的递归吗?
  • 您能详细说明一下吗?我不明白
  • 所有文件夹都有一个共同的根目录吗?
  • 是的,所有文件夹都有一个共同的根目录,并且每个文件夹的文件数都相同
  • 您定义了一个解析目录的函数,并且对于您找到的每个文件夹,您再次执行文件夹解析器。

标签: python subdirectory


【解决方案1】:

我不能 100% 确定语法,所以我会给你一个 Python 化的伪代码。它会为找到的每个文件夹调用 folder_parser,直到您通过所有文件夹层。

def folder_parser(dir):
    if(dir):
        for subdir in dir_list:
            if(is_a_folder()):
                folder_parser(subdir)
            elif(is_a_text()):
                do_your_text_thing()
            else: continue
    else: break

正如 Alfe 建议的那样,os.walk 也可以工作(对于大目录,可能或多或少地做同样的事情会快一点)。它返回具有 3 个值的元组生成器对象、路径、包含的文件夹列表以及目录和子目录中所有文件夹的包含文件列表。

for things in os.walk(dir):
    for files in things[2]:
        if(is_a_text(files)):
            do_your_text_thing(things[0]+files)

【讨论】:

  • 看看os.walk()
  • 我可以用 list_of_files=glob.glob('*.txt') 或其他东西替换 if 语句以保持我已有的程序结构吗?
  • @FrancescoDiLauro 我不确定您到底想替换什么,但由于 glob 返回一个列表,因此 if 语句不能被它替换。如果您确定目录中的文件只是文本文件或文件夹,则可以忽略 os.walk 部分中的 if 语句。
猜你喜欢
  • 1970-01-01
  • 2017-10-03
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 2017-05-11
  • 1970-01-01
相关资源
最近更新 更多