如何获取Python中的所有直接子目录

我正在尝试编写一个简单的Python脚本,将所有子目录中的index.tpl复制到index.html(有一些例外)。

我正在试图获取子目录列表陷入困境。

import os def get_immediate_subdirectories(a_dir): return [name for name in os.listdir(a_dir) if os.path.isdir(os.path.join(a_dir, name))] 

为什么没有人提到globglob可以让你使用Unix风格的path名扩展,并且可以运行几乎所有需要查找多个path名的东西。 这使得它非常简单:

 from glob import glob paths = glob('*/') 

请注意, glob将以最终斜杠返回目录(如同unix),而大多数基于path的解决scheme将省略最后一个斜杠。

 import os, os.path 

要获取目录中的(完整path)直接子目录,请执行以下操作:

 def SubDirPath (d): return filter(os.path.isdir, [os.path.join(d,f) for f in os.listdir(d)]) 

要获取最新(最新)的子目录:

 def LatestDirectory (d): return max(SubDirPath(d), key=os.path.getmtime) 

选中“ 获取当前目录中所有子目录的列表 ”。

这是一个Python 3版本:

 import os dir_list = next(os.walk('.'))[1] print(dir_list) 

在这种情况下os.walk是你的朋友。

直接从文档:

walk()通过从上到下或从下到上走树来生成目录树中的文件名。 对于根目录顶部(包括顶部本身)树中的每个目录,它产生一个3元组(dirpath,dirnames,文件名)。

使用Twisted的FilePath模块:

 from twisted.python.filepath import FilePath def subdirs(pathObj): for subpath in pathObj.walk(): if subpath.isdir(): yield subpath if __name__ == '__main__': for subdir in subdirs(FilePath(".")): print "Subdirectory:", subdir 

由于一些评论者询问了使用Twisted库的好处是什么,我会在这里超出原来的问题。


在分支中有一些改进的文档解释了FilePath的优点; 你可能想读这个。

更具体地说,在这个例子中:与标准库版本不同,这个函数可以在没有导入的情况下实现。 “subdirs”函数是完全通用的,因为它只是在其论点上运作。 为了使用标准库复制和移动文件,你需要依赖“ open ”内build,“ listdir ”,也许是“ isdir ”或“ os.walk ”或“ shutil.copy ”。 也许“ os.path.join ”也是。 更不用提的是,你需要一个string传递一个参数来识别实际的文件。 让我们来看看完整的实现,将每个目录的“index.tpl”复制到“index.html”:

 def copyTemplates(topdir): for subdir in subdirs(topdir): tpl = subdir.child("index.tpl") if tpl.exists(): tpl.copyTo(subdir.child("index.html")) 

上面的“subdirs”函数可以在任何类似FilePath的对象上工作。 这意味着,除其他外, ZipPath对象。 不幸的是ZipPath现在是只读的,但是它可以被扩展为支持写入。

您也可以传递自己的对象用于testing目的。 为了testing这里build议的使用os.path的API,你必须使用导入的名字和隐式的依赖关系,并且通常执行黑魔法来让你的testing工作。 有了FilePath,你可以这样做:

 class MyFakePath: def child(self, name): "Return an appropriate child object" def walk(self): "Return an iterable of MyFakePath objects" def exists(self): "Return true or false, as appropriate to the test" def isdir(self): "Return true or false, as appropriate to the test" ... subdirs(MyFakePath(...)) 

这个方法很好地完成了一切。

 from glob import glob subd = [s.rstrip("/") for s in glob(parent_dir+"*/")] 

我只写了一些代码来移动VMware虚拟机,最后使用os.pathshutil完成子目录之间的文件复制。

 def copy_client_files (file_src, file_dst): for file in os.listdir(file_src): print "Copying file: %s" % file shutil.copy(os.path.join(file_src, file), os.path.join(file_dst, file)) 

这不是非常优雅,但它确实工作。

这里有一个方法:

 import os import shutil def copy_over(path, from_name, to_name): for path, dirname, fnames in os.walk(path): for fname in fnames: if fname == from_name: shutil.copy(os.path.join(path, from_name), os.path.join(path, to_name)) copy_over('.', 'index.tpl', 'index.html')