首页 > 编程语言 >【Python】成功解决:`FileExistsError: [Errno 17] File exists: ‘xxx’`

【Python】成功解决:`FileExistsError: [Errno 17] File exists: ‘xxx’`

时间:2024-07-26 11:55:15浏览次数:14  
标签:文件 exists 17 FileExistsError filename file path os

【Python】成功解决:FileExistsError: [Errno 17] File exists: ‘xxx’

在这里插入图片描述

在Python编程中,处理文件和目录是常见的任务之一。然而,当我们尝试执行某些文件操作,如创建新文件或目录时,如果目标文件或目录已经存在,就可能会遇到FileExistsError异常。这个错误通常伴随着消息[Errno 17] File exists,表明你试图执行一个会覆盖现有文件或目录的操作,但你的代码没有正确处理这种情况。本文将深入探讨这个错误的原因、具体代码示例,并提供多种有效的解决办法。

一、错误原因

1. 尝试创建已存在的文件

在Python中,使用如open(filename, 'w')来创建并写入文件时,如果filename指定的文件已经存在,默认行为是覆盖原有文件。然而,如果你使用了一些库函数或自定义函数来“创建”文件,而这些函数内部没有检查文件是否已存在,就可能会抛出FileExistsError

2. 尝试在已存在的目录上创建同名目录

类似地,如果你尝试使用如os.makedirs(path)来创建一个目录,而path指定的目录已经存在,除非设置了exist_ok=True,否则os.makedirs会抛出FileExistsError

二、具体代码示例

示例1:尝试创建已存在的文件

filename = 'example.txt'

# 假设example.txt已经存在
with open(filename, 'w') as file:  # 这里不会抛出错误,因为'w'模式会覆盖文件
    file.write('Hello, World!')

# 但如果使用了某些不检查文件存在的库函数或自定义函数
def create_file(filename, content):
    with open(filename, 'x') as file:  # 'x'模式尝试创建文件,如果文件已存在则抛出FileExistsError
        file.write(content)

try:
    create_file(filename, 'Another content')
except FileExistsError as e:
    print(f"Error: {e}")

示例2:尝试在已存在的目录上创建同名目录

import os

dir_path = 'my_directory'

# 假设my_directory已经存在
try:
    os.makedirs(dir_path)  # 如果没有设置exist_ok=True,这将抛出FileExistsError
except FileExistsError as e:
    print(f"Error: {e}")

# 正确的做法
try:
    os.makedirs(dir_path, exist_ok=True)  # 如果目录已存在,不会抛出错误
except Exception as e:
    print(f"An unexpected error occurred: {e}")

三、解决办法

1. 检查文件或目录是否存在

在尝试创建文件或目录之前,你可以使用os.path.exists()来检查目标文件或目录是否已存在。

import os

filename = 'example.txt'
dir_path = 'my_directory'

# 检查文件是否存在
if not os.path.exists(filename):
    with open(filename, 'w') as file:
        file.write('Hello, World!')
else:
    print(f"The file {filename} already exists.")

# 检查目录是否存在
if not os.path.exists(dir_path):
    os.makedirs(dir_path)
else:
    print(f"The directory {dir_path} already exists.")

2. 使用异常处理

对于可能会抛出FileExistsError的操作,你可以使用try-except语句来捕获并处理这个异常。

import os

dir_path = 'my_directory'

try:
    os.makedirs(dir_path)
except FileExistsError:
    print(f"The directory {dir_path} already exists.")
except Exception as e:
    print(f"An unexpected error occurred: {e}")

3. 使用库函数的参数

对于某些库函数,如os.makedirs,可以通过设置参数(如exist_ok=True)来避免FileExistsError

import os

dir_path = 'my_directory'
os.makedirs(dir_path, exist_ok=True)  # 如果目录已存在,不会抛出错误

4. 更新或追加内容

如果你的目的是更新文件内容而不是简单地覆盖它,你应该以追加模式('a')打开文件,或者先读取现有内容,然后进行修改后再写回。

更新文件内容的示例
filename = 'example.txt'
new_content = 'This is a new line.\n'

# 读取现有内容
try:
    with open(filename, 'r') as file:
        existing_content = file.read()
except FileNotFoundError:
    existing_content = ''  # 如果文件不存在,则视为空文件

# 添加新内容
updated_content = existing_content + new_content

# 写回文件
with open(filename, 'w') as file:
    file.write(updated_content)

在这个例子中,我们首先尝试以读取模式('r')打开文件以获取其内容。如果文件不存在(会抛出FileNotFoundError),我们将其视为空文件。然后,我们将新内容添加到现有内容之后,并以写入模式('w')重新打开文件以写入更新后的内容。注意,这仍然会覆盖原始文件,但我们是通过先读取和修改内容来实现的,而不是简单地忽略文件已存在的事实。

追加内容到文件的示例

如果你只是想在文件末尾追加新内容,而不是覆盖整个文件,你可以使用追加模式('a')来打开文件。

filename = 'example.txt'
new_content = 'This is a new line appended to the file.\n'

# 追加新内容到文件
with open(filename, 'a') as file:
    file.write(new_content)

在这个例子中,无论文件是否存在,open函数以追加模式('a')打开文件,这意味着新内容会被添加到文件的末尾,而不是覆盖现有内容。

四、总结

FileExistsError是一个常见的Python异常,它在你尝试执行会覆盖已存在文件或目录的操作时发生。通过检查文件或目录是否存在、使用异常处理、利用库函数的参数(如exist_ok=True),或者更新和追加文件内容,你可以有效地解决这个错误。每种方法都有其适用场景,你应该根据你的具体需求来选择最合适的方法。

在处理文件和目录时,始终要考虑到异常处理和错误检查,以确保你的程序能够优雅地处理各种情况,包括那些你最初可能没有预料到的情况。这样做不仅可以提高程序的健壮性,还可以提升用户体验。

标签:文件,exists,17,FileExistsError,filename,file,path,os
From: https://blog.csdn.net/qq_38614074/article/details/140710428

相关文章

  • 在Linux环境配置多版本jdk,这里以8和17为例
    步骤1:下载Java17JDK访问Oracle官网下载Java17JDK:打开浏览器,访问OracleJDK17下载页面。登录并接受许可协议:如果你是Oracle用户,登录你的账户。如果不是,你可能需要创建一个账户或接受Oracle的许可协议才能下载。选择Java17下载:在下载页面上,选择适合你的......
  • 17 敏捷开发—Scrum(2)
            从上一篇「16敏捷开发实践(1)」中了解了Scrum是一个用于开发和维护复杂产品的框架,是一个增量的、迭代的开发过程。一般由多个Sprint(迭代冲刺)组成,每个Sprint长度一般为2-4周。下面全面介绍Scrumde角色、流程等。3个角色产品所有者(ProductOwner)定义所有产......
  • [题解]CF117C Cycle
    思路发现最简单的方法就是直接枚举三个点,但是复杂度\(\Theta(n^3)\)无法接受。考虑枚举一个点,并确定它的一条边,那么只需要再枚举一个点了。于是转化为了,对于每一个点找到其最好的出边。观察下图,\(a\toc\)的边是不必要的。因为,如果有一个三元环包含\(a\toc\),那么一定能......
  • 华为路由器漏洞CVE-2017-17215
    固件获取https://github.com/Vu1nT0tal/IoT-vulhub/tree/master/HUAWEI/CVE-2017-17215/firmware提取binwalk-MerHG532eV100R001C01B020_upgrade_packet.bin启动qemu-systemsudoqemu-system-mips-Mmalta-kernelvmlinux-3.2.0-4-4kc-malta-hdadebian_wheezy_mips......
  • P10717 题解
    好神仙的题目。赛时胡了一个状态和转移都和官解不同的做法,得到了\(O(n10^m)\)的优秀复杂度。卡了一场常卡进了\(75\)分。这个做法和官解关系不大,并且很难进行最后的优化部分,所以在此不再赘述。首先考虑\(k=1\)的情况。考虑记录一些状态能够描述子树内的选择方案,\(0\)表示......
  • 代码随想录算法训练营第 22 天 |LeetCode77. 组合 LeetCode 216.组合总和III LeetCode
    代码随想录算法训练营Day22代码随想录算法训练营第22天|LeetCode77.组合LeetCode216.组合总和IIILeetCode17.电话号码的字母组合目录代码随想录算法训练营前言LeetCode77.组合LeetCode216.组合总和IIILeetCode17.电话号码的字母组合一、基础1、回溯可以解......
  • 深入理解 Java17 新特性:Sealed Classes
    0关键总结JavaSE15在2020年9月发布,预览功能引入“封闭类”(JEP360)封闭类是一种限制哪些其他类或接口可扩展它的类或接口类似枚举,封闭类在领域模型中捕获替代方案,允许程序员和编译器推理其穷尽性封闭类对于创建安全的层次结构也很有用,通过解耦可访问性和可扩展性,允许库开......
  • vmware 17.5安装 deepin23-RC2桌面社区版【超超详细图文安装教程】
    1、去官网下载安装包最新版本–深度科技社区(deepin.org)2、新建虚拟机向导,选择典型,点击下一步3、选择刚才下载好的镜像文件,点击下一步4、选择Linux,ubuntu64位5、修改虚拟机安装位置,取一个虚拟机名称6、修改磁盘大小,要大于647、自定义硬件,修改内存和处理器大......
  • G71 可删除线性基+离线处理 P3733 [HAOI2017] 八纵八横
    视频链接:G71可删除线性基+离线处理P3733[HAOI2017]八纵八横_哔哩哔哩_bilibili   G67线性基+贪心法P4151[WC2011]最大XOR和路径-董晓-博客园(cnblogs.com) P3733[HAOI2017]八纵八横-洛谷|计算机科学教育新生态(luogu.com.cn)//可删除线性基+离......
  • VMware workstation 17.0 安装与激活
    解压VMware17到当前目录:点击下载压缩包提取码ynxc右键鼠标 VMware-workstation-full-17.0.0-20800274选择以管理员身份运行(A):点击下一步:点击我接受许可协议中的条款(A):点击下一步:点击更改安装位置选择自己所要安装的目录下:点击 下一步:点击 下一......