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

使用pandas读取vasprun.xml报错:文档末尾存在额外内容

解决vasprun.xml导入pandas DataFrame的XML语法错误问题

尝试通过以下代码将vasprun.xml导入pandas DataFrame时:

df = pd.read_xml("vasprun.xml")

出现XML语法错误,报错核心信息为:

lxml.etree.XMLSyntaxError: Extra content at the end of the document, line 88, column 2

且需要处理约900个这类文件,以下是可行的解决方案:

错误原因

这个报错说明XML文件不符合标准格式——根元素闭合后仍存在额外内容,大概率是VASP运行中断导致文件未正常收尾,或是文件生成过程中出现冗余内容。

解决方案

方案1:批量修复XML文件

通过脚本自动修复损坏的XML文件,利用lxml的错误恢复模式解析后重新生成标准XML:

import os
from lxml import etree

def fix_vasprun_xml(file_path):
    try:
        # 启用错误恢复模式解析XML
        parser = etree.XMLParser(recover=True)
        tree = etree.parse(file_path, parser)
        # 写入修复后的文件(可选择覆盖原文件,或生成新文件)
        fixed_path = file_path.replace(".xml", "_fixed.xml")
        tree.write(fixed_path, encoding='utf-8', xml_declaration=True)
        return True
    except Exception as e:
        print(f"修复{file_path}失败: {str(e)}")
        return False

# 批量处理目标文件夹下的所有vasprun.xml
target_folder = "/替换为你的文件目录/"
for root, dirs, files in os.walk(target_folder):
    for file in files:
        if file == "vasprun.xml":
            fix_vasprun_xml(os.path.join(root, file))

方案2:使用VASP专用工具读取(推荐)

vasprun.xml是VASP专属输出文件,用专门的材料计算库读取更高效且容错性更强,比如pymatgen:

from pymatgen.io.vasp import Vasprun
import pandas as pd
import os

def extract_vasprun_data(file_path):
    # 初始化Vasprun对象,ignore_errors参数可跳过部分文件损坏问题
    vr = Vasprun(file_path, ignore_errors=True)
    # 提取所需数据(示例为离子步的能量和步长,可根据需求调整)
    ionic_data = []
    for idx, step in enumerate(vr.ionic_steps):
        ionic_data.append({
            "file_name": os.path.basename(file_path),
            "step_idx": idx + 1,
            "total_energy": step["e_0_energy"],
            "avg_force": step["forces"].mean()
        })
    return pd.DataFrame(ionic_data)

# 批量读取并合并所有文件数据
all_dfs = []
target_folder = "/替换为你的文件目录/"
for root, dirs, files in os.walk(target_folder):
    for file in files:
        if file == "vasprun.xml":
            df = extract_vasprun_data(os.path.join(root, file))
            all_dfs.append(df)

final_df = pd.concat(all_dfs, ignore_index=True)

pymatgen会自动处理VASP输出文件的结构,无需手动解析XML,还能直接提取结构化的计算数据。

方案3:调整pandas读取参数

如果不想修改文件,可尝试将带有错误恢复的解析器传入pd.read_xml:

import pandas as pd
from lxml import etree

# 启用错误恢复模式的解析器
parser = etree.XMLParser(recover=True)
df = pd.read_xml("vasprun.xml", parser=parser)

这种方法可能会丢失部分数据,仅适合临时应急使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:45:36