Python循环读取sourceX.html文件时遇不存在文件如何终止循环?
解决循环读取系列文件时的IOError问题
我看到你的问题了——当脚本尝试读取不存在的sourceX.html时会抛出IOError,而且因为文件数量不确定,需要自动终止循环。咱们先拆解下原代码里的问题:
你的循环条件while os.path.isfile(filename)判断的是上一轮循环使用的文件名,但在循环内部你又重新计算了新文件名并直接打开,这就导致当新文件不存在时,没有提前检查就触发了打开错误。比如第一次循环判断source1.html存在,进入循环后直接去打开source2.html,如果这个文件不存在,就会直接报错。
方案1:修正文件存在性检查逻辑
调整代码顺序,先计算下一个要读取的文件名,检查是否存在后再处理,不存在就直接终止循环:
from bs4 import BeautifulSoup import re import os.path savefile = open('OUTPUT.csv', 'w') n = 1 while True: filename = f"source{n}.html" # 用f-string简化字符串拼接 if not os.path.isfile(filename): break # 文件不存在,立刻终止循环 # 文件存在,开始处理内容 with open(filename, "r") as file: # 使用with语句自动关闭文件,避免资源泄漏 soup = BeautifulSoup(file, "html.parser") thedata = soup.find("div", class_="cplayer") strdata = str(thedata) DoRegEx = re.compile('/([^/]+)\.jpg') jpgs = DoRegEx.findall(strdata) strjpgs = "Extracted Layers: \n \n" + "\n".join(jpgs) + "\n \n" savefile.write(f"{filename}\n") savefile.write(strjpgs) print(filename) print(strjpgs) n += 1 savefile.close() print("done")
方案2:用try-except捕获IOError(更Pythonic的写法)
Python里有个常用理念叫“请求原谅比请求许可好”(EAFP),我们可以直接尝试打开文件,捕获打开失败的异常,然后终止循环:
from bs4 import BeautifulSoup import re savefile = open('OUTPUT.csv', 'w') n = 1 while True: filename = f"source{n}.html" try: with open(filename, "r") as file: soup = BeautifulSoup(file, "html.parser") thedata = soup.find("div", class_="cplayer") strdata = str(thedata) DoRegEx = re.compile('/([^/]+)\.jpg') jpgs = DoRegEx.findall(strdata) strjpgs = "Extracted Layers: \n \n" + "\n".join(jpgs) + "\n \n" savefile.write(f"{filename}\n") savefile.write(strjpgs) print(filename) print(strjpgs) except IOError: # 文件不存在或无法打开,终止循环 break n += 1 savefile.close() print("done")
这个方案不需要提前检查文件是否存在,直接尝试操作,失败就捕获异常退出,还能避免“检查-打开”之间的竞态问题(比如检查时文件存在,但打开前被意外删除的情况)。
两种方案都能解决你的问题,你可以根据自己的习惯选择~
内容的提问来源于stack exchange,提问作者Chagger
相关产品推荐
相关产品推荐

