很多刚学 Python 的朋友在做自动化办公、批量整理文件、备份数据时都会遇到一个非常基础但又很高频的需求把一个文件复制到另一个位置。这时候Python 标准库里的shutil.copy()就非常好用。它简单直接上手快非常适合初学者。这篇文章就用最通俗的方式带你彻底搞懂shutil.copy()是什么shutil.copy()怎么用复制文件时会不会覆盖和copy2()、copyfile()有什么区别实战中常见报错怎么解决一、什么是 shutil.copyshutil是 Python 自带的一个高级文件操作模块专门用来处理复制、移动、删除、打包等文件系统任务。其中shutil.copy(src, dst)表示src源文件路径dst目标路径它的作用就是把 src 文件复制到 dst 指定的位置。二、最基础的用法先来看一个最简单的例子。import shutilshutil.copy(a.txt, b.txt)这段代码的意思是把当前目录下的a.txt复制一份并命名为b.txt。如果b.txt不存在就会新建。如果b.txt已经存在通常会被直接覆盖。三、复制到指定文件夹怎么写很多时候我们不是想改名而是想复制到某个目录里。例如import shutilshutil.copy(a.txt, D:/test/)这段代码表示把a.txt复制到D:/test/文件夹中。复制后目标文件通常会变成D:/test/a.txt也就是说如果dst是一个文件夹Python 会保留原文件名如果dst是一个完整文件名Python 会复制并改名四、复制并重命名文件比如你想把a.txt复制到另一个目录并且顺便改个名字import shutilshutil.copy(a.txt, D:/test/new_a.txt)执行后目标位置会生成一个新的文件D:/test/new_a.txt这在做文件备份、批量生成副本时特别常见。五、shutil.copy 会复制什么内容shutil.copy()主要会复制文件内容文件权限信息部分元数据但它不会完整复制所有元数据。如果你不仅想复制文件内容还想尽可能保留原文件的修改时间、访问时间等信息通常更推荐使用shutil.copy2()例如import shutilshutil.copy2(a.txt, D:/test/)六、copy、copy2、copyfile 有什么区别这是很多初学者最容易混淆的地方。1shutil.copyfile()只复制文件内容不复制权限、时间等信息。import shutilshutil.copyfile(a.txt, b.txt)特点目标必须是完整文件名不能直接写成目录更偏底层一点2shutil.copy()复制文件内容 权限信息。import shutilshutil.copy(a.txt, D:/test/)特点最常用可以复制到目录适合绝大多数日常开发场景3shutil.copy2()复制文件内容 更完整的元数据。import shutilshutil.copy2(a.txt, D:/test/)特点比copy()保留的信息更多更适合备份场景简单总结如果你只是想“把文件复制过去就行”那直接用shutil.copy()通常就够了。七、复制文件时目标文件不存在怎么办不用担心。如果目标路径中的文件名不存在shutil.copy()会自动创建目标文件。例如import shutilshutil.copy(a.txt, D:/test/backup.txt)如果backup.txt不存在会直接创建并复制过去。但要注意前提是目标目录D:/test/必须已经存在。如果目录不存在就会报错。八、目标目录不存在会怎样例如下面这段代码import shutilshutil.copy(a.txt, D:/abc/test/)如果D:/abc/test/这个目录不存在程序通常会报错类似FileNotFoundError所以更稳妥的写法是先创建目录再复制文件。import osimport shutildst_dir D:/abc/test/os.makedirs(dst_dir, exist_okTrue)shutil.copy(a.txt, dst_dir)这里的os.makedirs(dst_dir, exist_okTrue)意思是如果目录不存在就自动创建如果已经存在也不会报错这是一种非常实用的写法。九、实战把一个文件备份到 backup 文件夹下面写一个更贴近实际项目的小案例。需求把report.xlsx复制到backup文件夹如果文件夹不存在自动创建代码如下import osimport shutilsrc_file report.xlsxdst_dir backupos.makedirs(dst_dir, exist_okTrue)shutil.copy(src_file, dst_dir)print(文件备份完成)运行后当前目录下会生成一个backup文件夹并把report.xlsx复制进去。这个思路在自动化办公里非常常见比如备份日报归档合同自动保存日志文件批量整理下载目录十、实战批量复制多个文件如果你有很多文件要一起复制也可以配合循环来做。import osimport shutilfile_list [a.txt, b.txt, c.txt]dst_dir backup_filesos.makedirs(dst_dir, exist_okTrue)for file_name in file_list:if os.path.exists(file_name):shutil.copy(file_name, dst_dir)print(f{file_name} 复制完成)else:print(f{file_name} 不存在跳过)这样就可以把多个文件批量复制到指定目录中。十一、shutil.copy 会覆盖已有文件吗这个问题很多人都会问。一般来说如果目标位置已经有同名文件shutil.copy()会直接覆盖。例如import shutilshutil.copy(a.txt, D:/test/a.txt)如果D:/test/a.txt已经存在那么原来的文件内容很可能会被新文件覆盖掉。所以在正式项目里最好先判断一下。import osimport shutilsrc_file a.txtdst_file D:/test/a.txtif not os.path.exists(dst_file):shutil.copy(src_file, dst_file)print(复制成功)else:print(目标文件已存在未执行复制)如果你想避免覆盖这样写会更安全。十二、如何复制后自动改名避免覆盖有些场景下目标文件已经存在但你又不想覆盖它可以给新文件自动加时间戳。例如import osimport shutilfrom datetime import datetimesrc_file a.txtdst_dir backupos.makedirs(dst_dir, exist_okTrue)timestamp datetime.now().strftime(%Y%m%d_%H%M%S)dst_file os.path.join(dst_dir, fa_{timestamp}.txt)shutil.copy(src_file, dst_file)print(复制成功, dst_file)这样每次复制都会得到一个新的文件名非常适合做备份。十三、常见报错及解决办法1FileNotFoundError常见原因源文件不存在目标目录不存在解决方法检查src路径是否正确先用os.makedirs()创建目标目录2PermissionError常见原因文件正在被别的程序占用没有写入权限解决方法关闭正在占用该文件的软件检查目录权限尝试以管理员身份运行程序3源路径写错Windows 下路径写法经常出问题比如D:\test\a.txt这里的\t可能会被当成转义字符。更推荐这样写rD:\test\a.txt或者D:/test/a.txt这两种写法都更稳。十四、推荐用法配合 pathlib 写得更优雅如果你用的是较新的 Python 版本也可以结合pathlib。from pathlib import Pathimport shutilsrc Path(a.txt)dst_dir Path(backup)dst_dir.mkdir(exist_okTrue)shutil.copy(src, dst_dir)这样路径处理会更清晰代码也更现代一些。十五、总结什么时候该用 shutil.copy如果你现在的需求是复制一个文件到另一个地方复制到目录中并保留原名复制后顺便改名做简单的文件备份那么shutil.copy()就是最实用、最省事的选择。你只需要记住一句话shutil.copy(src, dst)把源文件复制到目标位置目标可以是文件名也可以是目录。如果你还想保留更多文件元数据就用shutil.copy2()如果你只想复制纯内容就用shutil.copyfile()十六、完整示例代码最后附上一段比较实用的完整示例适合直接练习import os import shutil from datetime import datetime src_file a.txt dst_dir backup if not os.path.exists(src_file): print(源文件不存在) else: os.makedirs(dst_dir, exist_okTrue) timestamp datetime.now().strftime(%Y%m%d_%H%M%S) dst_file os.path.join(dst_dir, fa_{timestamp}.txt) shutil.copy(src_file, dst_file) print(文件复制成功, dst_file)这个例子实现了判断源文件是否存在自动创建目标目录自动生成不重复文件名执行复制操作非常适合拿来做备份脚本的基础模板。结尾shutil.copy()虽然只是 Python 文件操作中的一个小知识点但在实际开发、自动化办公、脚本工具中出现的频率非常高。把这个方法搞明白后你后面再学批量文件整理自动备份脚本下载文件归档自动化办公处理都会轻松很多。如果你是刚开始学 Python建议你亲手把文中的几个示例都敲一遍理解会比单纯看文章快得多。
Python文件复制 shutil.copy 怎么用?一篇文章讲清楚文件复制、覆盖与常见坑
很多刚学 Python 的朋友在做自动化办公、批量整理文件、备份数据时都会遇到一个非常基础但又很高频的需求把一个文件复制到另一个位置。这时候Python 标准库里的shutil.copy()就非常好用。它简单直接上手快非常适合初学者。这篇文章就用最通俗的方式带你彻底搞懂shutil.copy()是什么shutil.copy()怎么用复制文件时会不会覆盖和copy2()、copyfile()有什么区别实战中常见报错怎么解决一、什么是 shutil.copyshutil是 Python 自带的一个高级文件操作模块专门用来处理复制、移动、删除、打包等文件系统任务。其中shutil.copy(src, dst)表示src源文件路径dst目标路径它的作用就是把 src 文件复制到 dst 指定的位置。二、最基础的用法先来看一个最简单的例子。import shutilshutil.copy(a.txt, b.txt)这段代码的意思是把当前目录下的a.txt复制一份并命名为b.txt。如果b.txt不存在就会新建。如果b.txt已经存在通常会被直接覆盖。三、复制到指定文件夹怎么写很多时候我们不是想改名而是想复制到某个目录里。例如import shutilshutil.copy(a.txt, D:/test/)这段代码表示把a.txt复制到D:/test/文件夹中。复制后目标文件通常会变成D:/test/a.txt也就是说如果dst是一个文件夹Python 会保留原文件名如果dst是一个完整文件名Python 会复制并改名四、复制并重命名文件比如你想把a.txt复制到另一个目录并且顺便改个名字import shutilshutil.copy(a.txt, D:/test/new_a.txt)执行后目标位置会生成一个新的文件D:/test/new_a.txt这在做文件备份、批量生成副本时特别常见。五、shutil.copy 会复制什么内容shutil.copy()主要会复制文件内容文件权限信息部分元数据但它不会完整复制所有元数据。如果你不仅想复制文件内容还想尽可能保留原文件的修改时间、访问时间等信息通常更推荐使用shutil.copy2()例如import shutilshutil.copy2(a.txt, D:/test/)六、copy、copy2、copyfile 有什么区别这是很多初学者最容易混淆的地方。1shutil.copyfile()只复制文件内容不复制权限、时间等信息。import shutilshutil.copyfile(a.txt, b.txt)特点目标必须是完整文件名不能直接写成目录更偏底层一点2shutil.copy()复制文件内容 权限信息。import shutilshutil.copy(a.txt, D:/test/)特点最常用可以复制到目录适合绝大多数日常开发场景3shutil.copy2()复制文件内容 更完整的元数据。import shutilshutil.copy2(a.txt, D:/test/)特点比copy()保留的信息更多更适合备份场景简单总结如果你只是想“把文件复制过去就行”那直接用shutil.copy()通常就够了。七、复制文件时目标文件不存在怎么办不用担心。如果目标路径中的文件名不存在shutil.copy()会自动创建目标文件。例如import shutilshutil.copy(a.txt, D:/test/backup.txt)如果backup.txt不存在会直接创建并复制过去。但要注意前提是目标目录D:/test/必须已经存在。如果目录不存在就会报错。八、目标目录不存在会怎样例如下面这段代码import shutilshutil.copy(a.txt, D:/abc/test/)如果D:/abc/test/这个目录不存在程序通常会报错类似FileNotFoundError所以更稳妥的写法是先创建目录再复制文件。import osimport shutildst_dir D:/abc/test/os.makedirs(dst_dir, exist_okTrue)shutil.copy(a.txt, dst_dir)这里的os.makedirs(dst_dir, exist_okTrue)意思是如果目录不存在就自动创建如果已经存在也不会报错这是一种非常实用的写法。九、实战把一个文件备份到 backup 文件夹下面写一个更贴近实际项目的小案例。需求把report.xlsx复制到backup文件夹如果文件夹不存在自动创建代码如下import osimport shutilsrc_file report.xlsxdst_dir backupos.makedirs(dst_dir, exist_okTrue)shutil.copy(src_file, dst_dir)print(文件备份完成)运行后当前目录下会生成一个backup文件夹并把report.xlsx复制进去。这个思路在自动化办公里非常常见比如备份日报归档合同自动保存日志文件批量整理下载目录十、实战批量复制多个文件如果你有很多文件要一起复制也可以配合循环来做。import osimport shutilfile_list [a.txt, b.txt, c.txt]dst_dir backup_filesos.makedirs(dst_dir, exist_okTrue)for file_name in file_list:if os.path.exists(file_name):shutil.copy(file_name, dst_dir)print(f{file_name} 复制完成)else:print(f{file_name} 不存在跳过)这样就可以把多个文件批量复制到指定目录中。十一、shutil.copy 会覆盖已有文件吗这个问题很多人都会问。一般来说如果目标位置已经有同名文件shutil.copy()会直接覆盖。例如import shutilshutil.copy(a.txt, D:/test/a.txt)如果D:/test/a.txt已经存在那么原来的文件内容很可能会被新文件覆盖掉。所以在正式项目里最好先判断一下。import osimport shutilsrc_file a.txtdst_file D:/test/a.txtif not os.path.exists(dst_file):shutil.copy(src_file, dst_file)print(复制成功)else:print(目标文件已存在未执行复制)如果你想避免覆盖这样写会更安全。十二、如何复制后自动改名避免覆盖有些场景下目标文件已经存在但你又不想覆盖它可以给新文件自动加时间戳。例如import osimport shutilfrom datetime import datetimesrc_file a.txtdst_dir backupos.makedirs(dst_dir, exist_okTrue)timestamp datetime.now().strftime(%Y%m%d_%H%M%S)dst_file os.path.join(dst_dir, fa_{timestamp}.txt)shutil.copy(src_file, dst_file)print(复制成功, dst_file)这样每次复制都会得到一个新的文件名非常适合做备份。十三、常见报错及解决办法1FileNotFoundError常见原因源文件不存在目标目录不存在解决方法检查src路径是否正确先用os.makedirs()创建目标目录2PermissionError常见原因文件正在被别的程序占用没有写入权限解决方法关闭正在占用该文件的软件检查目录权限尝试以管理员身份运行程序3源路径写错Windows 下路径写法经常出问题比如D:\test\a.txt这里的\t可能会被当成转义字符。更推荐这样写rD:\test\a.txt或者D:/test/a.txt这两种写法都更稳。十四、推荐用法配合 pathlib 写得更优雅如果你用的是较新的 Python 版本也可以结合pathlib。from pathlib import Pathimport shutilsrc Path(a.txt)dst_dir Path(backup)dst_dir.mkdir(exist_okTrue)shutil.copy(src, dst_dir)这样路径处理会更清晰代码也更现代一些。十五、总结什么时候该用 shutil.copy如果你现在的需求是复制一个文件到另一个地方复制到目录中并保留原名复制后顺便改名做简单的文件备份那么shutil.copy()就是最实用、最省事的选择。你只需要记住一句话shutil.copy(src, dst)把源文件复制到目标位置目标可以是文件名也可以是目录。如果你还想保留更多文件元数据就用shutil.copy2()如果你只想复制纯内容就用shutil.copyfile()十六、完整示例代码最后附上一段比较实用的完整示例适合直接练习import os import shutil from datetime import datetime src_file a.txt dst_dir backup if not os.path.exists(src_file): print(源文件不存在) else: os.makedirs(dst_dir, exist_okTrue) timestamp datetime.now().strftime(%Y%m%d_%H%M%S) dst_file os.path.join(dst_dir, fa_{timestamp}.txt) shutil.copy(src_file, dst_file) print(文件复制成功, dst_file)这个例子实现了判断源文件是否存在自动创建目标目录自动生成不重复文件名执行复制操作非常适合拿来做备份脚本的基础模板。结尾shutil.copy()虽然只是 Python 文件操作中的一个小知识点但在实际开发、自动化办公、脚本工具中出现的频率非常高。把这个方法搞明白后你后面再学批量文件整理自动备份脚本下载文件归档自动化办公处理都会轻松很多。如果你是刚开始学 Python建议你亲手把文中的几个示例都敲一遍理解会比单纯看文章快得多。