如何让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
相关产品推荐
相关产品推荐

