How to get all of the immediate subdirectories in Python
我正在尝试编写一个简单的python脚本,它将把index.tpl复制到所有子目录中的index.html(除了少数例外)。
我正试图得到子目录的列表而陷入困境。
1 2 3 4 | 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))] |
为什么没有人提到
1 2 | from glob import glob paths = glob('*/') |
注意,
选中"获取当前目录中所有子目录的列表"。
下面是python 3版本:
1 2 3 4 5 | import os dir_list = next(os.walk('.'))[1] print(dir_list) |
1 | import os, os.path |
要获取目录中的(完整路径)直接子目录,请执行以下操作:
1 2 | def SubDirPath (d): return filter(os.path.isdir, [os.path.join(d,f) for f in os.listdir(d)]) |
要获取最新(最新)子目录:
1 2 | def LatestDirectory (d): return max(SubDirPath(d), key=os.path.getmtime) |
在这种情况下,
直接从文件中:
walk() generates the file names in a directory tree, by walking the tree either top down or bottom up. For each directory in the tree rooted at directory top (including top itself), it yields a 3-tuple (dirpath, dirnames, filenames).
这个方法一次就很好地完成了这一切。
1 2 | from glob import glob subd = [s.rstrip("/") for s in glob(parent_dir+"*/")] |
使用Twisted的文件路径模块:
1 2 3 4 5 6 7 8 9 10 | 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"函数是完全通用的,因为它只对其参数进行操作。为了使用标准库复制和移动文件,需要依赖"
1 2 3 4 5 | def copyTemplates(topdir): for subdir in subdirs(topdir): tpl = subdir.child("index.tpl") if tpl.exists(): tpl.copyTo(subdir.child("index.html")) |
上面的"subdirs"功能可以在任何类
您还可以通过自己的对象进行测试。为了使用这里建议的API测试os.path,您必须使用导入的名称和隐式的依赖项,并且通常执行黑色魔术来使测试工作。使用filepath,可以执行如下操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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(...)) |
我刚刚编写了一些代码来移动vmware虚拟机,最后使用
1 2 3 4 | 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)) |
它不太雅致,但确实有用。
这里有一种方法:
1 2 3 4 5 6 7 8 9 10 11 | 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') |
我必须提到path.py库,我经常使用它。
提取直接子目录变得如此简单:
完整的工作示例是:
1 2 3 4 5 | from path import Path my_directory = Path("path/to/my/directory") subdirs = my_directory.dirs() |
NB: my_directory still can be manipulated as a string, since Path is a subclass of string, but providing a bunch of useful methods for manipulating paths
1 2 3 4 5 6 7 8 9 | import glob import os def child_dirs(path): cd = os.getcwd() # save the current working directory os.chdir(path) # change directory dirs = glob.glob("*/") # get all the subdirectories os.chdir(cd) # change directory to the script original location return dirs |
1 2 3 4 5 6 | dir | -- dir_1 -- dir_2 child_dirs('dir') -> ['dir_1', 'dir_2'] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | def get_folders_in_directories_recursively(self, directory, index=0): folder_list = list() parent_directory = directory for path, subdirs, _ in os.walk(directory): if not index: for sdirs in subdirs: folder_path ="{}/{}".format(path, sdirs) folder_list.append(folder_path) elif path[len(parent_directory):].count('/') + 1 == index: for sdirs in subdirs: folder_path ="{}/{}".format(path, sdirs) folder_list.append(folder_path) return folder_list |
以下函数可以调用为:
递归获取目录中的文件夹(目录,索引=1)->给出一级文件夹列表
以递归方式获取目录中的文件夹(目录)->给出所有子文件夹