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

9nvpjoqh  于 2021-09-08  发布在  Java
关注(0)|答案(5)|浏览(334)

此问题已在此处找到答案

如何检查文件是否存在且没有异常((44个答案)
昨天关门了。
我试图编写一段代码,每次运行python3脚本时都会打开一个新文件。
我正在使用递增的数字构造文件名。
例如,以下是应生成的有效文件名的一些示例:

output_0.csv
output_1.csv
output_2.csv
output_3.csv

在下一次运行脚本时,要使用的下一个文件名应为 output_4.csv .
在c/c++中,我将按以下方式执行此操作:
进入无限循环
尝试在“读取”模式下打开第一个文件名
如果文件已打开,请增加文件名编号并重复
如果文件未打开,请中断循环并以“写入”模式重新打开文件
这在Python3中似乎不起作用,因为在读取模式下打开不存在的文件会引发异常。
一种可能的解决方案是将打开的文件代码块移动到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

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

bz4sfanl

bz4sfanl1#

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

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

1wnzp6jl

1wnzp6jl2#

您可以在使用之前检查文件是否存在

os.path.exists(filename)
qrjkbowd

qrjkbowd3#

您可以使用操作系统模块检查文件路径是否为文件,然后将其打开:

import os

file_path = './file.csv'

if(os.path.isfile(file_path)):
    with open(file_path, "r") as f:
u1ehiz5o

u1ehiz5o4#

这应该起作用:

filename_base = "output"
filename_ext = "csv"
filename_number = 0

while True:
    filename_full = f"{filename_base}_{filename_number}.{filename_ext}"
    try:
      with open(filename_full, "r") as f:
          print(f"File {filename_full} exists")
          filename_number += 1
    except FileNotFoundError:
      print("Creating new file")
      open(filename_full, 'w');
      break;
qacovj5a

qacovj5a5#

你可以 os.path.exists 例如,检查文件是否已存在

import os
print(os.path.exists("output_0.csv"))

或者你的名字

output_0.csv
output_1.csv
output_2.csv
output_3.csv

你很有规律,对吗 glob.glob 像这样

import glob
existing = glob.glob("output_*.csv")
print(existing)  # list of existing files

相关问题