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

2024-10-03 09:20:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python还很陌生,有一段我想实现的代码让我不知所措。我希望我能在这里找到一些帮助。在

我有一个特定的文件列表,我想复制到一个目录中。我在网上读了很多建议,但我还没有读到足够具体的东西。在

所以,情况是这样的:我有多个图片文件在不同的文件夹在“从”文件夹。我只想把我想要的复制到目标文件夹“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,但对我来说没什么用。。。在

一开始我想创建一个包含文件及其url的词典,但是它比预期的要复杂(因为很多原因),所以最简单的方法是能够在子文件夹中找到这些文件。在

许多坦克

巴特。在


Tags: 文件pathnametestsrc文件夹namesos
3条回答

使用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()

在运行脚本之前*

^{pr2}$

运行脚本

[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

这将使一个包含源目录的文件名及其子目录的文件名的列表在一个列表中:

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

然后您可以继续执行代码:

^{pr2}$

虽然你必须搜索整个目录树,但只能搜索一次。在

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

我已经仔细看过了。我想我理解他们,即使他们不是这样工作的。在

我终于设法得到了我想要的东西,但这是明智之举。在

我通过创建文件夹列表得到了文件的副本。在

代码如下:

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)

这是我开始时的树:

^{pr2}$

最后我想

\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

现在我需要在FROM中创建目录列表手术室步行我想是吧。因为我用程序的时候应该有几千个。在

这需要很多阶段,我相信有更好的方法可以用更少的代码来实现。。。在

不管怎样,我想对你们的回答给出一个“反馈”,谢谢大家。在

巴特。在

相关问题 更多 >