0

0

python怎么复制一个文件_python文件复制操作实现方法

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-09-12 20:07:01

|

627人浏览过

|

来源于php中文网

原创

最推荐使用shutil.copy2()复制文件,因其能保留文件内容、权限及元数据(如修改时间、访问时间),适用于备份与迁移;若目标文件存在,默认会直接覆盖,可通过os.path.exists()预先检查并处理;复制目录则需用shutil.copytree(),支持递归复制及忽略特定文件。

python怎么复制一个文件_python文件复制操作实现方法

用Python复制文件,最直接且推荐的方式是使用内置的

shutil
模块。它提供了一系列高级文件操作,其中
shutil.copy()
shutil.copyfile()
shutil.copy2()
是实现文件复制的核心函数,它们各自在处理文件元数据和权限方面有细微差别,但都能有效完成任务。

解决方案

在Python中复制文件,我们通常会依赖

shutil
(shell utilities)模块。这个模块的设计初衷就是为了提供更高级、更方便的文件和目录操作,远比
os
模块里的低级函数来得顺手。

核心函数是

shutil.copy2()
。我的经验告诉我,如果不是有特别明确的需求,比如只复制内容不关心权限,那么
copy2
几乎是你在做文件复制时最稳妥、最全面的选择。它不仅复制了文件的内容,还会尽可能地保留原始文件的元数据,比如修改时间、访问时间、权限位等等。这在做备份或者迁移时尤为重要,能确保新文件与旧文件在系统层面保持一致性。

import shutil
import os

source_file = "my_document.txt"
destination_file = "backup_document.txt"

# 假设my_document.txt存在
# with open(source_file, "w") as f:
#     f.write("这是我的重要文档内容。\n")
#     f.write("一些敏感信息,需要保留权限和时间戳。\n")

try:
    # 使用shutil.copy2()复制文件,保留元数据
    shutil.copy2(source_file, destination_file)
    print(f"文件 '{source_file}' 已成功复制到 '{destination_file}',并保留了元数据。")

    # 验证一下修改时间是否一致
    src_mtime = os.path.getmtime(source_file)
    dst_mtime = os.path.getmtime(destination_file)
    print(f"源文件修改时间: {src_mtime}")
    print(f"目标文件修改时间: {dst_mtime}")
    if src_mtime == dst_mtime:
        print("修改时间已成功保留。")
    else:
        print("修改时间未能完全保留,可能与文件系统或操作系统有关。")

except FileNotFoundError:
    print(f"错误:源文件 '{source_file}' 不存在。")
except PermissionError:
    print(f"错误:没有权限复制文件到 '{destination_file}'。")
except Exception as e:
    print(f"复制文件时发生未知错误: {e}")

# 另外两个函数简要提一下:
# shutil.copyfile(src, dst):只复制文件内容,不复制元数据。
# shutil.copy(src, dst):复制文件内容和权限,但不保证复制所有元数据(比如修改时间)。
# 所以,如果你需要最全面的复制,记住用copy2。

Python复制文件时如何处理目标文件已存在的情况?

这是一个非常实际的问题。默认情况下,

shutil.copy()
shutil.copyfile()
shutil.copy2()
在目标路径存在同名文件时,都会直接覆盖掉。它们不会像某些图形界面工具那样弹出一个“是否覆盖?”的提示。这在自动化脚本中是方便的,但有时也可能导致数据丢失

立即学习Python免费学习笔记(深入)”;

我的做法通常有两种:

  1. 预先检查并决定行为:在调用复制函数之前,先用

    os.path.exists()
    检查目标文件是否存在。如果存在,你可以选择跳过复制、重命名目标文件、或者明确地覆盖。这种方式给了你最大的控制权。

    import shutil
    import os
    
    source_file = "my_document.txt"
    destination_file = "backup_document.txt"
    
    if os.path.exists(destination_file):
        print(f"目标文件 '{destination_file}' 已存在。")
        # 我们可以选择:
        # 1. 询问用户 (在交互式脚本中)
        # 2. 自动重命名目标文件
        # new_destination_file = destination_file + ".bak"
        # os.rename(destination_file, new_destination_file)
        # print(f"已将现有文件重命名为 '{new_destination_file}'。")
        # 3. 直接覆盖 (这是shutil.copy2的默认行为)
        print("将直接覆盖现有文件。")
    
    try:
        shutil.copy2(source_file, destination_file)
        print(f"文件 '{source_file}' 已成功复制到 '{destination_file}'。")
    except FileNotFoundError:
        print(f"错误:源文件 '{source_file}' 不存在。")
    except Exception as e:
        print(f"复制文件时发生错误: {e}")
  2. 利用异常处理:虽然

    shutil.copy
    系列函数本身不会因为文件存在而抛出特定的
    FileExistsError
    (它们会直接覆盖),但如果你在更复杂的场景下,比如先尝试移动文件,或者自定义了复制逻辑,那么
    FileExistsError
    就可能派上用场。不过对于
    shutil.copy2
    这种直接覆盖的,这种方式就不太适用了。最稳妥的还是第一种,明确地检查。

Python复制文件与复制目录有什么区别,如何实现?

这是个好问题,因为文件和目录在操作系统层面就是不同的实体。

shutil.copy()
系列函数是专门用来复制单个文件的。如果你想复制整个目录,包括它里面的所有子目录和文件,那就需要用到
shutil.copytree()

GradPen论文
GradPen论文

GradPen是一款AI论文智能助手,深度融合DeepSeek,为您的学术之路保驾护航,祝您写作顺利!

下载

shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False, dirs_exist_ok=False)

  • src
    :源目录的路径。
  • dst
    :目标目录的路径。
  • symlinks
    :如果为
    True
    ,符号链接会被复制为符号链接;如果为
    False
    (默认),符号链接会被复制为它们指向的实际文件或目录。
  • ignore
    :一个可调用对象,它接受目录名和目录中的文件列表,返回一个要忽略的文件名列表。这在复制时排除某些文件(比如
    .git
    目录、
    __pycache__
    )时非常有用。
  • copy_function
    :指定用于复制文件的函数,默认为
    shutil.copy2
  • dirs_exist_ok
    :Python 3.8+ 新增参数。如果为
    True
    ,目标目录可以存在,
    copytree
    会尝试合并内容;如果为
    False
    (默认),目标目录必须不存在,否则会抛出
    FileExistsError

实现示例:

import shutil
import os

source_dir = "my_project_folder"
destination_dir = "project_backup"

# 假设my_project_folder存在,并有一些文件和子目录
# os.makedirs(os.path.join(source_dir, "sub_dir"), exist_ok=True)
# with open(os.path.join(source_dir, "file1.txt"), "w") as f: f.write("Hello")
# with open(os.path.join(source_dir, "sub_dir", "file2.txt"), "w") as f: f.write("World")

try:
    # 复制整个目录
    # 注意:如果destination_dir已存在且dirs_exist_ok=False,会报错
    shutil.copytree(source_dir, destination_dir, dirs_exist_ok=True)
    print(f"目录 '{source_dir}' 已成功复制到 '{destination_dir}'。")

    # 举个例子,如何使用ignore参数排除文件
    # def ignore_pycache(directory, contents):
    #     return [c for c in contents if c == '__pycache__' or c.endswith('.pyc')]
    # shutil.copytree(source_dir, "project_backup_no_pycache", ignore=ignore_pycache)
    # print("目录复制完成,并忽略了__pycache__。")

except FileExistsError:
    print(f"错误:目标目录 '{destination_dir}' 已存在。请删除或使用dirs_exist_ok=True。")
except FileNotFoundError:
    print(f"错误:源目录 '{source_dir}' 不存在。")
except Exception as e:
    print(f"复制目录时发生错误: {e}")

Python复制文件时如何保留文件权限和修改时间?

这正是

shutil.copy2()
的用武之地,也是它与
shutil.copy()
shutil.copyfile()
最主要的区别。

  • shutil.copyfile(src, dst)
    : 这个函数是最基础的,它只负责将
    src
    文件的内容复制到
    dst
    。它不关心任何元数据,比如权限、修改时间、创建时间等。目标文件会获得当前用户/进程默认的权限和新的时间戳。如果你只是想快速复制文件内容,且不关心其他任何属性,它可能最快。

  • shutil.copy(src, dst)
    : 这个函数比
    copyfile
    进了一步,它会复制文件内容,并且会尝试复制源文件的权限位(
    st_mode
    )。但是,它通常不会复制其他元数据,比如修改时间(
    st_mtime
    )和访问时间(
    st_atime
    )。在某些操作系统上,它可能表现得更像
    copy2
    ,但在跨平台或特定场景下,其行为可能不如
    copy2
    一致。

  • shutil.copy2(src, dst)
    : 这是我个人最推荐的。它不仅复制了文件内容,还会尽力复制所有可用的元数据,包括权限位、修改时间、访问时间,甚至在某些系统上还有扩展属性。这使得目标文件成为源文件的一个近乎完美的副本,对于备份、归档或任何需要保持文件属性一致性的任务来说,都是最佳选择。

为什么保留这些元数据很重要?

  • 权限:对于可执行脚本、配置文件或者系统关键文件,权限设置至关重要。如果复制后权限丢失,文件可能无法执行,或者暴露不该暴露的信息。
  • 修改时间:在很多场景下,修改时间被用来判断文件的新旧、是否需要重新编译,或者用于增量备份。丢失修改时间可能导致错误的判断。
  • 访问时间:虽然不常用,但在某些审计或文件使用分析中,访问时间也有其价值。

所以,当你需要确保复制的文件尽可能地与原始文件一致时,毫不犹豫地选择

shutil.copy2()
。它在大多数情况下提供了最健壮和完整的复制功能。

相关文章

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
自建git服务器
自建git服务器

git服务器是目前流行的分布式版本控制系统之一,可以让多人协同开发同一个项目。本专题为大家提供自建git服务器相关的各种文章、以及下载和课程。

723

2023.07.05

git和svn的区别
git和svn的区别

git和svn的区别:1、定义不同;2、模型类型不同;3、存储单元不同;4、是否拥有全局版本号;5、内容完整性不同;6、版本库不同;7、克隆目录速度不同;8、分支不同。php中文网为大家带来了git和svn的相关知识、以及相关文章等内容。

553

2023.07.06

git撤销提交的commit
git撤销提交的commit

Git是一个强大的版本控制系统,它提供了很多功能帮助开发人员有效地管理和控制代码的变更,本专题为大家提供git 撤销提交的commit相关的各种文章内容,供大家免费下载体验。

267

2023.07.24

git提交错误怎么撤回
git提交错误怎么撤回

git提交错误撤回的方法:git reset head^:撤回最后一次提交,恢复到提交前状态。git revert head:创建新提交,内容与之前提交相反。git reset :使用提交的 sha-1 哈希撤回指定提交。交互式舞台区:标记要撤回的特定更改,然后提交,排除已撤回更改。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

556

2024.04.09

git怎么对比两个版本的文件内容
git怎么对比两个版本的文件内容

要对比两个版本的 git 文件,请使用 git diff 命令:git diff 比较工作树和暂存区之间的差异。git diff 比较两个提交或标签之间的差异。git diff 输出显示差异块,其中 + 表示添加的行,- 表示删除的行, 表示修改的行。可使用 gitkraken、meld、beyond compare 等可视化工具更直观地查看差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

518

2024.04.09

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

40

2025.12.13

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

109

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

16

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.3万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号