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

如何让Python在循环运行时刷新动态变化XML文件的节点?

如何在文件变化时刷新XML节点列表

你的问题核心在于当前代码会一次性读取完XML文件的所有节点,然后逐个yield,期间不会重新读取文件——哪怕文件已经更新了。要实现实时刷新,我们需要在每次迭代时检查文件是否修改,并在变化时重新加载节点列表。下面是具体的实现方案:

方案1:基于文件修改时间的实时刷新

我们可以利用os.path.getmtime()跟踪文件的最后修改时间,每次迭代前检查时间是否变化,如果变化就重新解析XML文件。同时为了避免重复遍历旧节点,我们可以维护一个当前遍历的索引,文件更新时重置索引。

修改后的代码如下:

import xml.etree.ElementTree as ET
from time import sleep
import os

def get_src():
    path = "input.xml"
    last_modified = 0
    nodes = []
    current_idx = 0
    
    while True:
        # 检查文件是否修改
        try:
            current_mtime = os.path.getmtime(path)
        except FileNotFoundError:
            print("文件不存在,等待3秒后重试...")
            sleep(3)
            continue
        
        if current_mtime != last_modified:
            # 文件已更新,重新加载节点
            try:
                root = ET.parse(path).getroot()
                nodes = root.findall('body/video')
                last_modified = current_mtime
                current_idx = 0  # 重置遍历索引
                print("检测到文件更新,已刷新节点列表")
            except ET.ParseError:
                print("XML文件格式错误,无法解析,使用旧节点列表")
                sleep(3)
                continue
        
        # 遍历节点列表,循环迭代
        if current_idx < len(nodes):
            src = nodes[current_idx].get('src')
            current_idx += 1
            yield src
        else:
            # 遍历完所有节点后等待3秒,再重新检查文件
            sleep(3)
            current_idx = 0  # 可选:遍历完后重置索引,重新开始遍历

for i in get_src():
    print(i)
    sleep(3)

代码说明:

  • 文件修改检测:每次循环先获取文件的最后修改时间,和上次保存的时间对比,如果不一致则重新加载XML。
  • 异常处理:加入了文件不存在、XML解析错误的处理,避免程序崩溃。
  • 遍历控制:用current_idx跟踪当前遍历的节点位置,文件更新时重置索引,确保立即开始遍历新的节点列表。

方案2:每次迭代都重新读取文件(简单但可能重复输出)

如果你的场景不需要严格避免重复遍历旧节点,只是希望尽可能及时获取最新内容,可以简化代码,每次yield前都重新读取文件:

import xml.etree.ElementTree as ET
from time import sleep

def get_src():
    path = "input.xml"
    while True:
        try:
            root = ET.parse(path).getroot()
            nodes = root.findall('body/video')
            for node in nodes:
                src = node.get('src')
                yield src
        except (FileNotFoundError, ET.ParseError) as e:
            print(f"读取文件出错: {e}")
        sleep(3)

for i in get_src():
    print(i)
    sleep(3)

注意点:

这种方式每次遍历完所有节点后会重新读取文件,但如果文件在遍历过程中更新,要等当前遍历完才会加载新内容。适合节点数量不多,对实时性要求不是极高的场景。

关键原理总结

  • 原来的代码问题是一次性读取文件后遍历所有节点,期间不重新读取,导致文件更新无法及时感知。
  • 核心改进点是在循环中定期检查文件状态,当文件变化时重新解析XML并更新节点列表。

内容的提问来源于stack exchange,提问作者jb_alvarado

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:54:46