python - Python 3:以读取模式打开文件而不引发异常?
问题描述
我正在尝试编写一段代码,每次运行 Python3 脚本时都会打开一个新文件。
我正在使用递增的数字构造文件名。
例如,以下是一些应生成的有效文件名示例:
output_0.csv
output_1.csv
output_2.csv
output_3.csv
在脚本的下一次运行中,下一个要使用的文件名应该是output_4.csv
.
在 C/C++ 中,我将通过以下方式执行此操作:
- 进入无限循环
- 尝试以“读取”模式打开第一个文件名
- 如果文件已打开,请增加文件名编号并重复
- 如果文件未打开,则跳出循环并以“写入”模式重新打开文件
这在 Python 3 中似乎不起作用,因为以读取模式打开一个不存在的文件会导致引发异常。
一种可能的解决方案可能是将打开的文件代码块移动到 try-catch 块内。但这似乎不是一个特别优雅的解决方案。
这是我到目前为止在代码中尝试过的
# open a file to store output data
filename_base = "output"
filename_ext = "csv"
filename_number = 0
while True:
filename_full = f"{filename_base}_{filename_number}.{filename_ext}"
with open(filename_full, "r") as f:
if f.closed:
print(f"Writing data to {filename_full}")
break
else:
print(f"File {filename_full} exists")
filename_number += 1
with open(filename_full, "w") as f:
pass
如上所述,此代码在尝试打开“读取”模式下不存在的文件时崩溃。
解决方案
使用 pathlib,您可以检查遇到文件或文件的符号链接时Path.is_file()
返回的内容。True
from pathlib import Path
filename_base = "output"
filename_ext = "csv"
filename_number = 0
filename_full = f"{filename_base}_{filename_number}.{filename_ext}"
p = Path(filename_full)
while p.is_file() or p.is_dir():
filename_number += 1
p = Path(f"{filename_base}_{filename_number}.{filename_ext}")
当文件不存在时,此循环应该退出,以便您可以打开它进行写入。
推荐阅读
- java - 我可以将请求中的多个参数组合成控制器的单个参数吗?
- c# - 无论如何将多个api端点聚合到单个swagger文档
- oracle - Oracle:使用来自同一表的聚合值更新表中的值
- c++ - Values changing after adding object pointer to vector
- sql-server - 加入子查询与加入表 - 为什么加入表不正确?
- ssl - activemq-cpp c++客户端如何使用ssl url连接服务器
- javascript - 如何在铯相机上设置最小缩放(和锁定轴)
- java - 有没有办法重定向 WOPI 休息调用以读取共享点文件?
- react-native - 如何从获取的 API 在渲染部分创建组件?
- azure-devops - 用于逻辑应用和天蓝色功能的 CI/CD 管道模板