gpt4 book ai didi

python - 基于 expat 的 xml 解析脚本在 Linux 上不工作,在 Windows 上工作

转载 作者:可可西里 更新时间:2023-11-01 11:14:35 26 4
gpt4 key购买 nike

我正在用 python 编写一组工具,以从交通模拟软件生成的一些 xml 文件中提取数据。由于生成的文件可能非常大,我使用 xml.parsers.expat 来解析它们。

问题是,当我在工作时在 Windows XP 机器上运行我的脚本时,它运行良好,但在家里,在 Ubuntu 10.10 上,在同一个文件上,我收到以下错误:
ExpatError:格式不正确(无效标记):第 1 行,第 0 列

该文件最初是用 utf-8 编码的,标签中声明的编码是 ascii,因此尝试将其更改为 utf-8(或 UTF8 或 utf8)但没有成功。由于没有 BOM,我尝试编写它,但仍然没有成功。我还尝试用 Unix 换行符 (CR) 替换 Windows 换行符 (CR/LF)。也没有任何成功。

此外,python 的工作版本是 2.7.1,在我的 Ubuntu 机器上是 2.6.6,但我认为我的问题与以下内容无关:几周前我将工作计算机的 Python 从 2.6 升级到 2.7,没有遇到任何问题.

因为我不是这方面的专家,所以我的想法已经用完了,有什么提示吗?

编辑:经过进一步调查(我现在很头疼,我讨厌与 Unicode 相关的麻烦),看起来问题已通过将系统环境变量 LANG、LC_ALL 和 LANGUAGE 正确设置为(在我的例子中)“fr_FR.utf-8”来解决。我不明白为什么他们一开始不这样做,也不明白为什么现在它起作用了...

谢谢你们的帮助!

最佳答案

文档摘录:

xml.parsers.expat.XML_ERROR_INVALID_TOKEN
当无法将输入字节正确分配给字符时引发;例如,UTF-8 输入流中的 NUL 字节(值 0)。

ExpatError.lineno
检测到错误的行号。第一行编号为1。

ExpatError.offset
发生错误的行中的字符偏移量。第一列编号为 0。

以上内容表明您的文件中的第一个字节有问题。

从原始文件开始,即适用于 Windows 的文件。编辑您的问题以显示这样做的结果:

python -c "print repr(open('win_ok_file.xml', 'rb').read(200))"

这将明确显示文件前 200 个字节的内容。

同时向我们展示您的代码的精简版本,您已经检查过它可以在 Windows 上运行以克服最初的错误,但在 Linux 上会重现该问题。

一些断言,关于它们的值(value):

  • “文件最初编码为utf-8 和声明的编码标签是 ascii"... 如果XML 声明中的编码是"ascii"但有非 ASCII文件中的字符,符合解析器应该引发异常。你确定你报告的是什么吗?

  • XML 的默认编码文件是UTF-8。换一种说法,如果编码中没有提到XML 声明,或者没有根本没有 XML 声明,解析器是需要使用 UTF-8 解码。

  • 将 UTF-8 BOM 放在开头是阻碍多于帮助。

  • XML 标准要求解析器接受 CR 作为 XML 中的有效字节文件,然后立即假装它不存在(除了可能在元素与xmlns:space="保留")。改变CR LFLF 不是一个好主意。

还有一些问题:一个“相当大”的文件有多少字节?您是否考虑过使用 xml.etree.cElementTreelxml 中的 iterparse()

关于python - 基于 expat 的 xml 解析脚本在 Linux 上不工作,在 Windows 上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5071420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com