Python:在所有子目录中运行脚本

时间:2016-06-05 16:53:05

标签: python

我是Python的新手,我正在用它来做一些数据分析。

我的问题如下:我有一个包含许多子目录的目录,每个子目录都包含大量数据文件。

我已经编写了一个Python脚本,当在其中一个子目录中执行时,执行数据分析并将其写入输出文件。该脚本包含一些我使用os.system()调用的shell命令,因此我必须“在”其中一个子目录中“才能”工作。

如何自动编写函数:

  1. 移至第一个子目录
  2. 执行脚本
  3. 返回父目录并移至下一个子目录
  4. 我想这可以使用os.walk()以某种方式完成,但我并不真正理解它是如何工作的。

    PS我知道this post的存在,但它并没有解决我的问题。

    PPS也许我应该指出我的函数不会将目录名作为参数。实际上它不需要争论。

4 个答案:

答案 0 :(得分:2)

os.walk 应该可以完美地完成您想要做的事情。开始使用此代码,您应该看到您需要做什么:

import os
path = r'C:\mystartingpath'

for (path, dirs, files) in os.walk(path):
    print "Path:", path

    print "\nDirs:"
    for d in dirs:
        print '\t'+d

    print "\nFiles:"
    for f in files:
        print '\t'+f

    print "----"

此代码将执行的操作是向您显示os.walk将遍历您选择的起始路径的所有子目录。进入每个目录后,您可以通过连接路径和文件名来获取每个文件名的完整路径。例如:

path_to_intersting_file = path+'\\'+filename

# (This assumes that you saved your filename into a variable called filename)

使用每个文件的完整路径,您可以在os.walk for循环中执行分析。添加分析代码,以便for循环不仅仅是打印内容。

答案 1 :(得分:1)

要在Python中更改工作目录,您需要:

os.chdir(your_path)

然后您可以递归运行脚本。

示例代码:

import os

directory_to_check = "your_dir" # Which directory do you want to start with?

def my_function(directory):
      print("Listing: " + directory)
      print("\t-" + "\n\t-".join(os.listdir("."))) # List current working directory

# Get all the subdirectories of directory_to_check recursively and store them in a list:
directories = [os.path.abspath(x[0]) for x in os.walk(directory_to_check)]
directories.remove(os.path.abspath(directory_to_check)) # If you don't want your main directory included

for i in directories:
      os.chdir(i)         # Change working Directory
      my_function(i)      # Run your function

我不知道你的剧本是如何运作的,因为你的问题很普遍,所以我只能给出一般的答案....

但我认为你需要的是:

  1. 获取所有子目录并使用os.walk
  2. 存储它们
  3. 使用 os.chdir
  4. 更改工作目录 单独

    os.walk将不起作用

    我希望这有帮助! 祝你好运!

答案 2 :(得分:0)

这样就可以了。

for dir in os.listdir(your_root_directory):
    yourFunction(dir)

os.listdir方法仅返回根目录中的目录列表。

然而,os.walk方法以递归方式遍历目录,这使得它对其他事物有用,os.listdir可能更好。

但是,为了完整起见,这里有一个os.walk选项:

for dir in next(os.walk(your_directory))[1]:
    yourFunction(dir)

请注意,os.walk是一个生成器,因此是下一个调用。第一个下一个调用,生成一个元组根,dirs,文件。在这种情况下,根是您的目录。您只对dirs感兴趣 - 子目录列表,因此您索引[1]。

答案 3 :(得分:0)

如果要对文件夹的每个子文件夹执行某个操作,一种方法是编写递归函数,一次处理一个目录。我希望我的例子有点帮助: http://pastebin.com/8G7JzcQ2