【Python】将文件复制到另一个文件夹,将文件夹复制到新的位置

本文深入探讨了Python shutil模块中的copy(), copyfile()和copytree()方法。解释了这些方法如何处理文件和目录的复制,包括权限复制和错误处理。通过实际代码示例展示了如何使用copytree()函数来复制整个目录树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Package:shutil

方法:

shutil.copy()

copy() 方法的功能类似于 Unix 中的“cp”命令。这意味着如果目标是一个文件夹,那么它将在其中创建一个与源文件具有相同名称(基本名称)的新文件。此外,该方法会在复制源文件的内容后同步目标文件权限到源文件。

shutil.copyfile():

它将源内容复制到目标文件中。

如果目标文件不可写入,那么复制操作将导致 IOError 异常。

如果源文件和目标文件都相同,它将会返回 SameFileError。

但是,如果目标文件之前有不同的名称,那么该副本将会覆盖其内容。

如果目标是一个目录,这意味着此方法不会复制到目录,那么会发生 Error 13。

 

copy() vs copyfile() :

copy() 还可以在复制内容时设置权限位,而 copyfile() 只复制数据。

如果目标是目录,则 copy() 将复制文件,而 copyfile() 会失败,出现 Error 13。

 

--------------------------------------------------------------7.11更新-------------------------------------------------------------------------------------

今天用到了对文件夹进行复制/移动的操作,在这里使用的事copytree()函数。

具体代码如下:

def copy_file_to_species(dataset_dir, sub_class_dir, sub_dir):
    class_dir = os.path.join(dataset_dir, sub_class_dir)
    little_sample = get_little_sample(class_dir)
    for directory in os.listdir(class_dir):
        if directory in little_sample:
            print(directory)
            files = os.path.join(class_dir, directory)
            print(files)
            little_sample_file = os.path.join(dataset_dir, sub_dir, directory)
            #print(little_sample_file)
            #copytree会自动创建新目录

            shutil.copytree(files, little_sample_file)

            #shutil.copy(img_file, genus_file)

复制的语句为: 

 shutil.copytree(files, little_sample_file)

  •  files为原文件夹,即需要复制的文件夹
  • little_sample_file为新文件夹,该文件夹下存的就是复制过来的文件

原始文件夹:D:\CC\**\数据2015\**********\train_data\3500

目标文件夹:D:\CC\**\数据2015\**********\sample_data\3500

 我只是将train_data下面的文件 夹移动到了sample_data下。

 

 

 

https://cloud.tencent.com/developer/news/183282

### Python 实现文件复制到文件夹Python 中,可以利用 `shutil` 和 `os` 模块来完成文件的复制操作。以下是具体方法: #### 使用 `shutil.copy()` 方法 `shutil.copy(src, dst)` 可以将源文件 `src` 复制到目标位置 `dst`。如果目标是一个文件,则会覆盖该文件;如果是目录,则会在该目录下创建一个同名文件。 ```python import shutil source_file = 'path/to/source/file.txt' # 替换为实际的源文件路径 destination_folder = 'path/to/destination/folder/' # 替换为目标文件夹路径 # 将 source_file 文件复制到 destination_folder 下 shutil.copy(source_file, destination_folder) # 如果目标是文件夹文件名保持不变 ``` 此代码片段展示了如何使用 `shutil.copy()` 来实现文件复制功能[^1]。 --- #### 使用 `shutil.copy2()` 方法 与 `shutil.copy()` 类似,`shutil.copy2()` 不仅复制文件内容,还会保留元数据(如修改时间)。其语法如下: ```python import shutil source_file = 'path/to/source/file.txt' destination_folder = 'path/to/destination/folder/' shutil.copy2(source_file, destination_folder) # 保留更多文件属性 ``` 这种方法适用于需要保留原始文件属性的情况。 --- #### 使用递归方式复制整个文件夹及其内容 当需要复制整个文件夹以及其中的所有子文件夹文件时,可采用递归的方式或者直接调用 `shutil.copytree()` 函数。 ##### 利用 `shutil.copytree()` `shutil.copytree()` 是一种简单的方法,用于复制整个目录树。 ```python import shutil source_directory = 'path/to/source/directory/' destination_directory = 'path/to/destination/directory/' shutil.copytree(source_directory, destination_directory) # 完整复制目录结构 ``` 注意:目标目录不能存在,否则会抛出异常。如果希望覆盖已存在的目录,需先删除它或手动处理冲突情况[^3]。 --- #### 自定义递归函数实现复杂需求 对于更复杂的场景,比如过滤某些特定类型的文件或将多个来源合并到同一目标中,可以通过编写自定义递归来满足这些需求。 以下是一个简单的例子,展示如何递归遍历并复制指定扩展名的文件: ```python import os import shutil def copy_files_with_extension(src_root, dst_root, extension='.txt'): """ Recursively copies all files with a specific extension from src_root to dst_root. :param src_root: Source directory path :param dst_root: Destination directory path :param extension: File extension filter (e.g., '.txt') """ for root, dirs, files in os.walk(src_root): # 遍历源目录下的所有子目录和文件 relative_path = os.path.relpath(root, src_root) # 获取相对路径 target_dir = os.path.join(dst_root, relative_path) if not os.path.exists(target_dir): os.makedirs(target_dir) # 创建对应的目标子目录 for file_name in files: if file_name.endswith(extension): # 根据扩展名筛选文件 full_src_path = os.path.join(root, file_name) full_dst_path = os.path.join(target_dir, file_name) shutil.copy(full_src_path, full_dst_path) # 调用示例 copy_files_with_extension('/path/to/src', '/path/to/dst', '.log') # 复制 .log 文件 ``` 上述代码实现了基于扩展名的选择性复制逻辑。 --- ### 总结 通过以上几种方法,可以根据不同需求灵活选择适合的方式来完成文件文件夹的复制任务。无论是单个文件还是整个目录树,都可以借助标准库模块轻松达成目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值