python写二进制大文件,如何将文件写入二进制文件,或在大文件中编辑单行– Python...

我有几个大型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文件的一些建议表示赞赏。

谢谢

解决方案

暂无回答

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值