我有几个大型XML文件,由于某些无法识别的字符而无法解析,投诉类似于:
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 528370, column 153
在较小的文件上,我也看到了这一点,但是可以使用文本编辑器打开文件并解决问题。但是,我的文本编辑器不会读取大文件。
我一起整理了一个Python脚本来打印相关行,从中我可以看到似乎存在unicode编码问题,因为“ µ”(用于micro [metres])被编码为\ xb5,我认为应该在该位置是\ x00B5。在同一行中有几个。
我发现读取该行的唯一方法是将其作为二进制文件。其他任何内容都无法解析(即unicode解析器无法读取)。
我找不到一种方法来读取该行,对其进行修复,然后仅写回该行。
因此,为了避免出现如此大的文件大小,我以为是不明智的尝试,我也许可以逐行拆分文件,编辑带有错误的文件,然后将它们重新缝合在一起。拆分中的每个文件为512,000行。
显然,这破坏了单个文件中的XML,但是如果我以正确的顺序将它们重新缝合在一起,这不是问题。我无法将文件解析为较小的XML元素,因为如上所述,ElementTree在编码上令人窒息。
因此,这是我的脚本,用于按行分割文件:
import contextlib
file_large = 'thefile.rdf'
l = 1024*512 # lines per split file
with contextlib.ExitStack() as stack:
fd_in = stack.enter_context(open(file_large, 'rb'))
for i, line in enumerate(fd_in):
if not i % l:
file_split = '{}.{}'.format(file_large, i//l)
fd_out = stack.enter_context(open(file_split, 'w'))
fd_out.write('{}'.format(line))
这很好并且足够快地工作了,除了它将二进制行写为字符串外,这样,当您在文本编辑器中读取文件时,您会在一行上获得500k行,并且文本读取如下:
…b'\r\n'b'\r\n'b'University of Durham\r\n'b'\r\n'b'\r\n'b…
这似乎表明它先读取二进制文件,然后将其写为字符串。我尝试将最后两行更改为:
fd_out = stack.enter_context(open(file_split, 'w+b'))
fd_out.write('{}'.format(bytearray(line)))
但是然后我得到了一个Python错误:
TypeError: a bytes-like object is required, not 'str'
因此,您将对如何解决二进制写入问题或更好的方法就地纠正大型XML文件的一些建议表示赞赏。
谢谢
解决方案
暂无回答