Python3如何在不抛出异常的情况下以只读模式打开文件?并实现每次运行脚本生成递增编号的新输出文件
实现递增编号的新文件创建(无异常捕获版)
我懂你不想依赖try-except的顾虑——毕竟在C/C++里我们习惯了通过尝试打开来判断文件是否存在,但Python里确实有更直接的方式来做这件事,完全不用靠异常处理来实现逻辑。下面给你两种优雅的实现方案:
方案一:逐个检查文件存在性(对应你的C/C++思路)
我们可以用os.path.exists()直接判断目标文件是否存在,逻辑和你熟悉的写法几乎一致,而且完全不会触发异常:
import os filename_base = "output" filename_ext = "csv" filename_number = 0 while True: filename_full = f"{filename_base}_{filename_number}.{filename_ext}" if not os.path.exists(filename_full): # 找到不存在的文件名,跳出循环准备写入 break # 文件已存在,递增编号继续查找 filename_number += 1 # 创建并写入文件 with open(filename_full, "w") as f: print(f"Writing data to {filename_full}") # 这里添加你的写入逻辑,比如 f.write("your content here")
这个方法简单直观,和你原本的思路完美匹配,代码可读性也很强,适合文件数量不多的场景。
方案二:批量获取现有编号,直接生成下一个(更高效)
如果以后脚本会生成大量这类文件,逐个检查的效率会越来越低。这时候可以用glob模块一次性扫描所有已存在的output_*.csv文件,提取编号后直接算出下一个可用编号:
import glob import os filename_base = "output" filename_ext = "csv" # 获取所有已存在的目标格式文件 existing_files = glob.glob(f"{filename_base}_*.{filename_ext}") max_num = -1 for file in existing_files: # 提取文件名中的数字部分:先去掉扩展名,再分割下划线取最后一段 num_str = os.path.splitext(file)[0].split("_")[-1] if num_str.isdigit(): num = int(num_str) if num > max_num: max_num = num # 下一个编号为最大编号+1,若没有文件则从0开始 filename_number = max_num + 1 filename_full = f"{filename_base}_{filename_number}.{filename_ext}" # 创建文件 with open(filename_full, "w") as f: print(f"Writing data to {filename_full}") # 添加你的写入逻辑
这个方法只需要一次文件系统扫描,不管有多少文件都能快速定位下一个编号,效率更高,适合长期使用的脚本。
为什么你的原代码会崩溃?
你原来的代码用with open(filename_full, "r")尝试打开不存在的文件时,Python会直接抛出FileNotFoundError,而你没有捕获这个异常,所以脚本会崩溃。上面的两种方案都通过提前检查文件存在性,避开了这个问题。
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

