在Python中复制多个文件


Answers:


138

您可以使用os.listdir()来获取源目录中的文件,使用os.path.isfile()来查看它们是否为常规文件(包括* nix系统上的符号链接),然后使用shutil.copy进行复制。

以下代码仅将常规文件从源目录复制到目标目录(我假设您不希望复制任何子目录)。

import os
import shutil
src_files = os.listdir(src)
for file_name in src_files:
    full_file_name = os.path.join(src, file_name)
    if os.path.isfile(full_file_name):
        shutil.copy(full_file_name, dest)

dest应该是C:\ myfolder还是C:\ myfolder \ filename.ext之类的东西吗?
史蒂夫·伯恩

4
@StevenByrne可以是任意一个,具体取决于您是否还要重命名该文件。如果不是,dest则为目录名称。shutil.copy(src, dst)“将文件src复制到文件或目录dst。...如果dst指定目录,则将使用src中的基本文件名将文件复制到dst。”

29

如果您不想复制整个树(带有子目录等),请使用或glob.glob("path/to/dir/*.*")获取所有文件名的列表,遍历该列表并用于shutil.copy复制每个文件。

for filename in glob.glob(os.path.join(source_dir, '*.*')):
    shutil.copy(filename, dest_dir)

2
注意:您可能必须使用os.path.isfile()检查全局结果,以确保它们是文件名。另请参阅GreenMatt的答案。尽管glob确实仅返回文件名(如os.listdir),但它仍然还返回目录名。的' 只要您没有无扩展名的文件名或目录名中的点,“ pattern”就足够了。
史蒂文

这不会复制子目录
citynorman


5
def recursive_copy_files(source_path, destination_path, override=False):
    """
    Recursive copies files from source  to destination directory.
    :param source_path: source directory
    :param destination_path: destination directory
    :param override if True all files will be overridden otherwise skip if file exist
    :return: count of copied files
    """
    files_count = 0
    if not os.path.exists(destination_path):
        os.mkdir(destination_path)
    items = glob.glob(source_path + '/*')
    for item in items:
        if os.path.isdir(item):
            path = os.path.join(destination_path, item.split('/')[-1])
            files_count += recursive_copy_files(source_path=item, destination_path=path, override=override)
        else:
            file = os.path.join(destination_path, item.split('/')[-1])
            if not os.path.exists(file) or override:
                shutil.copyfile(item, file)
                files_count += 1
    return files_count

1
可能有助于对您的代码进行口头解释
calico_

1
我认为您的意思是覆盖,而不是覆盖
Mohammad ElNesr

康斯坦丁很好的答案!!对我有很大帮助。一个建议,但:使用os.sep,而不是“/”(所以它适用于非Linux OS)
阿里

4
import os
import shutil
os.chdir('C:\\') #Make sure you add your source and destination path below

dir_src = ("C:\\foooo\\")
dir_dst = ("C:\\toooo\\")

for filename in os.listdir(dir_src):
    if filename.endswith('.txt'):
        shutil.copy( dir_src + filename, dir_dst)
    print(filename)

2

这是递归复制功能的另一个示例,该函数使您可以一次复制一个文件的目录(包括子目录)的内容,这是我用来解决此问题的方法。

import os
import shutil

def recursive_copy(src, dest):
    """
    Copy each file from src dir to dest dir, including sub-directories.
    """
    for item in os.listdir(src):
        file_path = os.path.join(src, item)

        # if item is a file, copy it
        if os.path.isfile(file_path):
            shutil.copy(file_path, dest)

        # else if item is a folder, recurse 
        elif os.path.isdir(file_path):
            new_dest = os.path.join(dest, item)
            os.mkdir(new_dest)
            recursive_copy(file_path, new_dest)

编辑:如果可以,绝对可以使用shutil.copytree(src, dest)。这要求目标文件夹尚不存在。如果您需要将文件复制到现有文件夹中,则上述方法效果很好!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.