Python文件复制操作中遇到的问题与解决方法

之前写的一个模块,运行一点问题都没有,今天某次打开以后,莫名其妙报错
进去看了下,原来是文件复制这这块出了问题
代码意图是将当前文件夹下的 screenshot.png 复制到 backup 目录中,并且命名加时间。 代码为:
orifilename = './screenshot.png'
destfilename = "./backup/screenshot_{0}.png".format(datetime.datetime.now().strftime('%Y_%m_%d_%H_%M_%S')) shutil.copyfile(orifilename, destfilename)

现在是 shutil.copyfile 这个报错,报 destfilename 文件不存在...
FileNotFoundError: [Errno 2] No such file or directory: './backup/screenshot_2018_01_19_22_44_07.png'

也看了源代码,
with open(src, 'rb') as fsrc:
with open(dst, 'wb') as fdst:
copyfileobj(fsrc, fdst)

源代码里主要是这里第二行报错,
复制文件,必须要源文件存在,为什么会是这样设计...
而且更诡异的是,之前运行一直良好,目标文件夹一直都有备份的文件。就今天才会报错...
我已经混乱了....
可能这个问题比较 Low,但是大家还是帮我看看吧...


Python文件复制操作中遇到的问题与解决方法

7 回复

./backup 这个文件夹是不是不存在


在Python里复制文件,最直接的方法是shutil.copy()shutil.copy2()copy()只复制内容,copy2()还会尽可能保留元数据(如修改时间)。如果目标目录不存在,这两个函数都会报错,所以最好先用os.makedirs()创建目录。

import shutil
import os

def copy_file_safe(src, dst):
    """安全复制文件,自动创建目标目录"""
    try:
        # 创建目标目录(如果不存在)
        os.makedirs(os.path.dirname(dst), exist_ok=True)
        # 复制文件并保留元数据
        shutil.copy2(src, dst)
        print(f"成功复制: {src} -> {dst}")
    except FileNotFoundError:
        print(f"错误:源文件不存在 {src}")
    except PermissionError:
        print(f"错误:没有权限访问 {src} 或 {dst}")
    except Exception as e:
        print(f"复制失败: {e}")

# 使用示例
copy_file_safe('/path/to/source.txt', '/path/to/destination/folder/target.txt')

常见坑点:Windows上复制正在被其他程序打开的文件可能会失败,需要处理权限问题;复制大文件时用shutil.copyfileobj()可以控制缓冲区大小;跨设备复制符号链接时要注意shutil.copy()会跟随链接,而shutil.copy2(..., follow_symlinks=False)可以保留链接本身。

简单总结:用shutil.copy2()并提前创建目录就能解决大部分问题。

if not os.path.exists(os.path.split(dst)[0]): os.makedirs(os.path.split(dst)[0])

  1. 确认"backup"文件夹是否存在;
    2. 确认代码运行的当前目录“./”是否正确。

刚一步一步调试且观察了文件夹,另外一个同事写的删除备份文件夹的程序被提前调用…导致我这边 backup 文件夹被删了。一直以为这个 backup 文件夹铁定在的。文件夹就被新建了一次…

这个锅 python 不背,操作系统的锅,顶多是 shutil 的锅

是我自己程序的问题,昨晚被这个 bug 搞懵逼了,谢谢大家。

回到顶部