Python 3:以读取模式打开文件而不引发异常?

use*_*501 6 python file-io python-3.x

我正在尝试编写一段代码,每次运行 Python3 脚本时都会打开一个新文件。

我正在使用递增的数字构建文件名。

例如,以下是应生成的有效文件名的一些示例:

output_0.csv
output_1.csv
output_2.csv
output_3.csv
Run Code Online (Sandbox Code Playgroud)

下次运行脚本时,下一个要使用的文件名应该是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
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lex 5

使用pathlib,您可以检查当遇到文件或文件的符号链接时,Path.is_file()它会返回。True

\n
from pathlib import Path\n\nfilename_base = "output"\nfilename_ext = "csv"\nfilename_number = 0\n\nfilename_full = f"{filename_base}_{filename_number}.{filename_ext}"\np = Path(filename_full)\n\nwhile p.is_file() or p.is_dir():\n    filename_number += 1\n    p = Path(f"{filename_base}_{filename_number}.{filename_ext}")\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n


小智 1

您可以使用 OS 模块检查文件路径是否是文件,然后打开它:

import os

file_path = './file.csv'

if(os.path.isfile(file_path)):
    with open(file_path, "r") as f:
Run Code Online (Sandbox Code Playgroud)