【问题标题】:FileExistsError: [WinError 183] Cannot create a file when that file already exists:FileExistsError:[WinError 183] 当文件已存在时无法创建文件:
【发布时间】:2018-02-14 03:39:33
【问题描述】:

我在运行这个测试程序时会产生以下错误。

import shutil    
src=r"G:\aaa"     
dst=r"F:\zzz"    
shutil.copytree(src,dst, symlinks=False, ignore=None)      

FileExistsError: [WinError 183] 当文件已存在时无法创建文件:

但是F:\zzz的文件夹是空的!!!

【问题讨论】:

  • 需要更多信息。测试程序的代码是什么?从输出看来,在尝试创建已经存在的文件时,对某些 File IO API 的调用会引发此错误。需要查看代码以获取更多信息。
  • @Jean-FrançoisFabre r 在字符串处理此之前
  • @Milk:是的。我的眼睛这么晚了 :) 对 OP 有好处。如果有人爱上它时我有一美元......

标签: python-2.7


【解决方案1】:

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

dirs_exist_ok 指示在 dst 或任何缺少的父目录已经存在的情况下是否引发异常。

Python 3.8 现在支持 dirs_exist_ok 参数。这将不再给出该错误并覆盖目标文件夹以防它已经存在。

因此你需要使用:

shutil.copytree(src, dst, dirs_exist_ok=True)

【讨论】:

    【解决方案2】:

    “当该文件已存在时无法创建文件”是一个通用的 Windows 消息,它令人困惑,因为它对于目录或常规文件是相同的。 (Windows 不以非常有用的错误消息而闻名,您必须这样做)

    来自shutil.copytree的在线帮助:

    >>> help(shutil.copytree)
    

    模块shutil中函数copytree的帮助:

    copytree(src, dst, symlinks=False, ignore=None, copy_function=, ignore_dangling_symlinks=False)

    递归复制目录树。

    目标目录必须不存在。

    所以第一次它可能有效,但其他时候你需要执行

    shutil.rmtree(dst)
    

    在复制树之前删除目标目录(请注意,Windows 对权限很烦,并且具有只读属性的文件可能会阻塞 shutil.rmtree,我个人将代码复制到自定义版本中(鼓励你在在线帮助中执行此操作)在删除常规文件之前添加os.chmod(path,0o777)

    【讨论】:

    • 谢谢。这是正确的。我认为它会在文件夹中创建。但它也创建了文件夹本身
    • OSError: [Errno 17] File exists: 是 Python 中的错误。所以 Python 在错误消息方面并不好......
    • 这是一条 Windows 消息。您可以捕获异常并将当前处理的文件名添加到异常消息中。
    猜你喜欢
    • 2022-07-06
    • 2021-09-29
    • 2022-12-16
    • 2020-04-12
    • 2019-06-26
    • 2021-11-19
    • 2017-07-29
    • 2012-11-12
    相关资源
    最近更新 更多