使用python从多个目录复制特定文件

时间:2015-08-06 15:30:23

标签: python copy

我对python很陌生,而且我被一段我想要实现的代码所困扰。我希望我能在这里找到一些帮助。

我有一个特定的文件列表,我想在一个目录中复制。我已经在互联网上阅读了很多建议,但我还没有读过足够具体的内容。

所以,在这种情况下:我在" FROM"中的不同文件夹中有多个图片文件。夹。我只想将我喜欢的内容复制到目标文件夹中#34; TO"

目前,这就是我所拥有的(来自Stackoverflow上的另一个主题):

src = "/Volumes/MacintoshHD/TEST_SHUTIL/FROM"
dst = "/Volumes/MacintoshHD/TEST_SHUTIL/TO"

file_names = ["120099.TIFF", "901664.TIFF", "902257.TIFF"]

for file_name in file_names:
    full_file_name = os.path.join(src, file_name)
    if (os.path.isfile(full_file_name)):
        shutil.copy(full_file_name, dst)

我想知道是否有办法在子文件夹中查找文件,如isfile但不测试每个文件夹。

我查看了copytree,但它对我来说并不是很有用......

起初我想用文件及其网址创建一个字典,但它比预期更复杂(由于很多原因),所以最简单的方法是能够在子文件夹中找到这些文件。

许多坦克

巴特。

4 个答案:

答案 0 :(得分:1)

这将生成一个包含源目录的文件名及其子目录的文件名的列表:

file_names = [os.path.join(dp, f) for dp, dn, fn 
                     in os.walk(src_dir) for f in fn]

然后您可以继续使用您的代码:

for file_name in file_names:
    full_file_name = os.path.join(src, file_name)
    if (os.path.isfile(full_file_name)):
        shutil.copy(full_file_name, dst)

虽然您必须搜索整个目录树,但只需搜索一次。

答案 1 :(得分:1)

谢谢大家的答案。自从我发布问题以来已经有一段时间了,从那时起我就没有时间测试你的答案了。所以请原谅我。

我仔细阅读了它们。我想我理解他们,即使他们没有像这样工作。

我终于设法得到我想要的东西,但它的注意事项尽可能聪明。

我通过创建文件夹列表获得了文件副本。

以下是代码:

import os, shutil, fnmatch

src = ["/Volumes/MacintoshHD/TEST_SHUTIL/FROM/1", "/Volumes/MacintoshHD/TEST_SHUTIL/FROM/2", "/Volumes/MacintoshHD/TEST_SHUTIL/FROM/3"]
dst = "/Volumes/MacintoshHD/TEST_SHUTIL/TO"

listePlanDev = ["00120099.TIFF", "06901664.TIFF", "06902257.TIFF"]

for file_name in listePlanDev :
    for dir_names in src:
        full_file_name = os.path.join(dir_names, file_name)
        if (os.path.isfile(full_file_name)):
            shutil.copy(full_file_name, dst)

所以这是我开始时的树:

\Volumes
    \MacintoshHD
        \TEST_SHUTIL
            \FROM
                \1
                - 00100001.TIFF
                - 00120099.TIFF
                \2
                - 06900001.TIFF
                - 06901664.TIFF
                \3
                - 06902257.TIFF
            \TO

最后我喜欢

\Volumes
    \MacintoshHD
        \TEST_SHUTIL
            \FROM
                \1
                - 00100001.TIFF
                - 00120099.TIFF
                \2
                - 06900001.TIFF
                - 06901664.TIFF
                \3
                - 06902257.TIFF
            \TO
            - 120099.TIFF
            - 901664.TIFF
            - 902257.TIFF

现在我需要使用os.walk在FROM中创建目录列表。当我使用程序时,应该有数千个它们。

这有很多阶段,我确信有更好的方法可以用更少的代码来实现它......

无论如何,我想提供一个"反馈"你的答案,谢谢大家。

巴特。

答案 2 :(得分:0)

使用os.walkfnmatch

<强> copytiffs.py

#~/usr/bin/env python
import os, shutil, fnmatch

def main():
    src = "Volumes/MacintoshHD/TEST_SHUTIL/FROM"
    dst = "Volumes/MacintoshHD/TEST_SHUTIL/TO"
    file_names = ["120099.TIFF", "901664.TIFF", "902257.TIFF"]

    for root, dirnames, filenames in os.walk(src):
        for target in file_names:
            for candidate_filename in fnmatch.filter(filenames, target):
                shutil.copy(os.path.join(root, candidate_filename), dst)

if __name__ == '__main__':
    main()

在运行脚本之前*

[root@joeyoung.io copyfiles]# tree ./
./
`-- Volumes
    `-- MacintoshHD
        `-- TEST_SHUTIL
            |-- FROM
            |   |-- 120099.TIFF
            |   |-- ignoreme.txt
            |   |-- sub1
            |   |   |-- 901664.TIFF
            |   |   `-- ignoreme.txt
            |   `-- sub2
            |       |-- 902257.TIFF
            |       `-- ignoreme.txt
            `-- TO

RUNNING SCRIPT

[root@joeyoung.io copyfiles]# python copytiffs.py

在运行脚本之后

[root@joeyoung.io copyfiles]# tree
.
|-- Volumes
|   `-- MacintoshHD
|       `-- TEST_SHUTIL
|           |-- FROM
|           |   |-- 120099.TIFF
|           |   |-- ignoreme.txt
|           |   |-- sub1
|           |   |   |-- 901664.TIFF
|           |   |   `-- ignoreme.txt
|           |   `-- sub2
|           |       |-- 902257.TIFF
|           |       `-- ignoreme.txt
|           `-- TO
|               |-- 120099.TIFF
|               |-- 901664.TIFF
|               `-- 902257.TIFF
`-- copytiffs.py

答案 3 :(得分:0)

也许在Unix中使用Python的find命令来搜索基础文件夹中的所有.TIFF个文件?

import os
file_paths = os.popen('find . -name \*.TIFF -print').read().split('\n')

此处.表示当前目录,您可以将其更改为您希望用作基本目录的路径。

<强>输出

>> for each in file_path:
       print each
 /Cpp/seive.TFF
 /Cpp/seive2.TFF
 ....