首页 > 解决方案 > 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

如上所述,此代码在尝试打开“读取”模式下不存在的文件时崩溃。

标签: pythonpython-3.xfile-io

解决方案


使用 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}")

当文件不存在时,此循环应该退出,以便您可以打开它进行写入。


推荐阅读