我是Python的新手,我正在用它来做一些数据分析。
我的问题如下:我有一个包含许多子目录的目录,每个子目录都包含大量数据文件。
我已经编写了一个Python脚本,当在其中一个子目录中执行时,执行数据分析并将其写入输出文件。该脚本包含一些我使用os.system()
调用的shell命令,因此我必须“在”其中一个子目录中“才能”工作。
如何自动编写函数:
我想这可以使用os.walk()
以某种方式完成,但我并不真正理解它是如何工作的。
PS我知道this post的存在,但它并没有解决我的问题。
PPS也许我应该指出我的函数不会将目录名作为参数。实际上它不需要争论。
答案 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
我不知道你的剧本是如何运作的,因为你的问题很普遍,所以我只能给出一般的答案....
但我认为你需要的是:
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