在Python中扁平化复杂的目录结构

2024-06-25

我想将文件从复杂的目录结构移动到一个地方。例如我有这么深的层次结构:

foo/
    foo2/
        1.jpg
    2.jpg
    ...

我希望它是:

1.jpg
2.jpg
...

我当前的解决方案:

def move(destination):
    for_removal = os.path.join(destination, '\\')
    is_in_parent = lambda x: x.find(for_removal) > -1
    with directory(destination):
        files_to_move = filter(is_in_parent,
                               glob_recursive(path='.'))
    for file in files_to_move:
        shutil.move(file, destination)

定义:directory https://stackoverflow.com/a/3012921/596361 and glob_recursive https://stackoverflow.com/a/2186565/596361。请注意,我的代码仅将文件移动到其公共父目录,而不是任意目的地。

如何简洁而优雅地将所有文件从复杂的层次结构移动到一个地方?


我不喜欢测试要移动的文件的名称来查看我们是否已经位于目标目录中。相反,此解决方案仅扫描目标的子目录

import os
import itertools
import shutil


def move(destination):
    all_files = []
    for root, _dirs, files in itertools.islice(os.walk(destination), 1, None):
        for filename in files:
            all_files.append(os.path.join(root, filename))
    for filename in all_files:
        shutil.move(filename, destination)

说明: os.walk 以“自上而下”的方式递归地走到目的地。整个文件名是通过 os.path.join(root, filename) 调用构造的。现在,为了防止扫描目标顶部的文件,我们只需要忽略 os.walk 迭代的第一个元素。为此,我使用 islice(iterator, 1, None)。另一种更明确的方法是这样做:

def move(destination):
    all_files = []
    first_loop_pass = True
    for root, _dirs, files in os.walk(destination):
        if first_loop_pass:
            first_loop_pass = False
            continue
        for filename in files:
            all_files.append(os.path.join(root, filename))
    for filename in all_files:
        shutil.move(filename, destination)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Python中扁平化复杂的目录结构 的相关文章

随机推荐