如何在Python中循环遍历每个子目录并将子目录中的所有文件作为组获取?

u5i3ibmn  于 2023-09-29  发布在  Python
关注(0)|答案(1)|浏览(156)

我需要逐个遍历目录中的文件夹,并对这些文件夹中的文件作为一个组执行一个函数。需要将这些文件连同它们各自的文件夹名称一起传递到函数中。有时,目录只包含一个文件,但很多时候它们包含两个或更多。此外,一些文件夹包含更多的文件夹,我需要提取文件路径作为一个组。
例如,我的文件结构可以是这样的:

  1. ├── root_folder
  2. ├── subdir1
  3. ├── file1.txt
  4. ├── file2.txt
  5. ├── subdir2
  6. ├── file3.txt
  7. ├── subdir3
  8. ├── file4.txt
  9. ├── file5.txt
  10. ├── file6.txt
  11. ├── subdir4
  12. | ├── subdir42
  13. | ├── file7.txt
  14. ├── subdir43
  15. | ├── file8.txt
  16. | ├── file9.txt

我想从每个目录中获取所有文件,并将目录名传递到函数中。以下是预期结果:

  • myfunc("file1.txt","file2.txt",subdir1)
  • myfunc("file3.txt",subdir2)
  • myfunc("file4.txt","file5.txt","file6.txt",subdir3)
  • myfunc("file7.txt",subdir42)
  • myfunc("file8.txt","file9.txt",subdir43)

简单地说,我需要递归地一个接一个地遍历每个文件夹,并使用该文件夹中的所有文件传递给一个函数。
我目前的代码只返回每个文件的所有文件路径,但就像我说的,我需要在组中使用它们(每个文件夹包含一组文件)。

  1. indir = "C:/path/to/indir"
  2. for path, directories, files in os.walk(indir):
  3. for file in files:
  4. fpath = os.path.join(path, file)
  5. print(fpath)

我对这件事束手无策。任何建议将不胜感激!

7y4bm7vi

7y4bm7vi1#

我认为你可以创建某种递归函数,你可以用它来遍历目录,然后返回一个列表中的非目录文件列表,你可以用它来传递给一个函数

  1. import os
  2. def traverse_directory(path):
  3. content = []
  4. files = os.listdir(path)
  5. for sf in files:
  6. f = os.path.join(path, sf)
  7. if os.path.isdir(f):
  8. content += traverse_directory(f)
  9. else:
  10. content.append(f)
  11. # pass all files with the folder into a function
  12. # function_call(content)
  13. return content
  14. print(traverse_directory('./root_folder'))
  15. # returns ['./root_folder/sudir4/subdir42/file7.txt', './root_folder/sudir4/subdir43/file8.txt', './root_folder/sudir4/subdir43/file9.txt', './root_folder/sudir3/file4.txt', './root_folder/sudir3/file5.txt', './root_folder/sudir3/file6.txt', './root_folder/sudir2/file3.txt', './root_folder/sudir1/file2.txt', './root_folder/sudir1/file1.txt']

编辑:根据你的更新预期函数调用,我认为我上面建议的类似方法应该工作,但不是返回子目录中的所有文件,它只是获取同一目录中的所有非目录文件,并作为函数调用的参数传递

  1. import os
  2. # sample myfunc to print out the input files and directory
  3. def myfunc(*args):
  4. files, dr = args[:-1], args[-1]
  5. print('myfunc:', files, dr)
  6. def traverse_directory(path):
  7. content = []
  8. files = os.listdir(path)
  9. for sf in files:
  10. f = os.path.join(path, sf)
  11. if os.path.isdir(f):
  12. traverse_directory(f)
  13. else:
  14. content.append(sf)
  15. if content:
  16. content.append(path.split('/')[-1])
  17. myfunc(*content)
  18. traverse_directory('./root_folder')

运行上面的示例数据结构应该会给予以下输出

  1. myfunc: ('file7.txt',) subdir42
  2. myfunc: ('file8.txt', 'file9.txt') subdir43
  3. myfunc: ('file4.txt', 'file5.txt', 'file6.txt') sudir3
  4. myfunc: ('file3.txt',) sudir2
  5. myfunc: ('file2.txt', 'file1.txt') sudir1
展开查看全部

相关问题