关于文件:如何获取Python中的所有直接子目录

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))]

为什么没有人提到globglob允许您使用Unix风格的路径名扩展,它是我的Go-to函数,用于几乎所有需要查找多个路径名的内容。这使得它非常容易:

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

注意,glob将返回带有最后一个斜杠的目录(就像unix那样),而大多数基于path的解决方案将省略最后一个斜杠。


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

下面是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)

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

直接从文件中:

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"函数是完全通用的,因为它只对其参数进行操作。为了使用标准库复制和移动文件,需要依赖"open内置"、"listdir内置"、"isdir内置"、"os.walk内置"或"EDOCX1〔5]内置"。也许"os.path.join"。更不用说,您需要一个字符串传递一个参数来标识实际的文件。让我们看一下完整的实现,它将每个目录的"index.tpl"复制到"index.html"中:

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"功能可以在任何类FilePath的对象上工作。这意味着,除其他外,ZipPath对象。不幸的是,ZipPath现在是只读的,但它可以扩展到支持写入。

您还可以通过自己的对象进行测试。为了使用这里建议的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虚拟机,最后使用os.pathshutil来完成子目录之间的文件复制。

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库,我经常使用它。

提取直接子目录变得如此简单:

my_dir.dirs()

完整的工作示例是:

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

child_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)->给出一级文件夹列表

以递归方式获取目录中的文件夹(目录)->给出所有子文件夹