You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:18:10