0

我有一个批处理文件,它通过数百个嵌套目录并将所有文件复制到一个目标(有效地展平源的副本)。我的批处理文件是:

set source="X:\"

set destination="Y:\"

for /R %source% %%f in (*.*)  do xcopy  "%%f" %destination% /D /Y

非常简单,但可以满足我的需要。现在我需要一个在 python 中做同样事情的解决方案。我对 python 很陌生,甚至在理论上也无法弄清楚它是如何工作的。我假设我需要 os.walk 遍历所有嵌套文件夹以获取文件并以某种方式将它们复制出来???任何帮助将不胜感激。通过谷歌,我发现了如何递归地浏览目录以及如何复制文件,但我找不到任何将两者联系在一起的解决方案。我目前使用python2(2.7)。

4

3 回答 3

4

您可以使用os.walk()在目录树中的所有文件上获取平面迭代器:

def find_files(root):
    for d, dirs, files in os.walk(root):
        for f in files:
            yield os.path.join(d, f)

现在您可以使用shutil.copy()每个文件将它们复制到目标位置。

于 2013-11-04T21:24:50.000 回答
1

您提到您找到了如何递归遍历目录以及如何复制文件。

尝试编写一个程序,简单地打印出它看到的每个文件的路径。

一旦你有了这个工作,只需print用你的复制功能替换该行。不需要魔法!

于 2013-11-04T21:23:56.193 回答
0

我怀疑这与您要查找的内容很接近:

$ cat copy-flatten
#!/usr/local/cpython-3.3/bin/python

import os
import sys
import shutil

assert sys.argv[2:]
assert not sys.argv[3:]

source_dir = sys.argv[1]
destination_dir = sys.argv[2]

for root, dirs, files in os.walk(source_dir):
    for filename in files:
        source_path = os.path.join(root, filename)
        destination_path = os.path.join(destination_dir, filename)
        print('Copying {} to {}'.format(source_path, destination_path))
        shutil.copy(source_path, destination_path)

$ cat Makefile

go:
        rm -rf ./dest
        mkdir -p ./dest
        ./copy-flatten /usr/src ./dest

clean:
        rm -rf ./dest
于 2013-11-04T21:33:20.153 回答