如何根据Python中文件名列表中的项目从目录中复制文件

时间:2011-11-29 22:47:36

标签: python

我是Python的新手,我创建了以下函数,根据列表中的项目(promptList)从目录(livepromptDir)复制文件。到目前为止,它只将列表中的第一项复制到目标目录。请帮忙!提前谢谢。

def copyItemToPrompt():
    #This function will copy all of the appropriate Voice Prompt files from LivePrompts directory to promptDir based on promptList

    os.chdir(livepromptDir)
    try:
        for i in range(0,len(promptList)):
            for filename in fnmatch.filter(os.listdir(livepromptDir), promptList[i]):
                shutil.copy(filename, promptDir)
            return

    except Exception as error:
        log(logFile, 'An error has occurred in the copyLiveToPrompt function: ' + str(error))
        raise

2 个答案:

答案 0 :(得分:2)

您希望将return移到for循环之外,否则您的函数会在第一次迭代后返回。实际上,你甚至不需要回报:

def copyItemToPrompt():
    """This function will copy all of the appropriate Voice Prompt files from LivePrompts directory to promptDir based on promptList"""

    os.chdir(livepromptDir)
    try:
        for i in range(0,len(promptList)):
            for filename in fnmatch.filter(os.listdir(livepromptDir), promptList[i]):
                shutil.copy(filename, promptDir)

    except Exception as error:
        log(logFile, 'An error has occurred in the copyLiveToPrompt function: ' + str(error))
        raise 

答案 1 :(得分:1)

正如@rcriii所提到的,回归是你的功能短路的原因。我不确定你要完成什么,但我认为你只想在给定一个glob-pattern列表的情况下将文件列表从一个dir复制到另一个dir。

如果是这样的话,并给你一个像这样的目录:

.
├── a
│   ├── file1
│   ├── file2
│   └── tmp3
└── b

这个功能应该让你有一个更简洁的方法来做到这一点(像for i in range...这样的东西通常没有像你在这里那样使用。)另外,如果你不能改变dirs有时会给你带来问题。改回来。

import shutil
from itertools import chain
from os import path
from glob import glob

def copy_with_patterns(src, dest, patterns):
    # add src dir to given patterns
    patterns = (path.join(src, x) for x in patterns)

    # get filtered list of files
    files = set(chain.from_iterable(glob(x) for x in patterns))

    # copy files
    for filename in files:
        shutil.copy(filename, filename.replace(src, dest))

像这样调用这个函数:

copy_with_patterns('a', 'b', ['file*'])

现在让你的目录看起来像这样:

.
├── a
│   ├── file1
│   ├── file2
│   └── tmp3
└── b
    ├── file1
    └── file2