【发布时间】:2011-05-13 17:34:28
【问题描述】:
我有一个xml文件,其中包含一组文本元素标签(每个标签包含相应二进制元素的十进制偏移值和数据长度)以及末尾所有元素的整个二进制数据。一个例子如下。
<?xml version="1.0" encoding="UTF-8"?>
<Package>
<element>
<offset>0</offset>
<length>2961181</length>
<checksum>4238515972</checksum>
<format>gzip</format>
</element>
<element>
<offset>2961181</offset>
<length>5442</length>
<checksum>4238515972</checksum>
<format>bin</format>
</element>
</Package>
BINARY_DATA
请注意,偏移量是十进制的,从标头之后的第一个字节开始计算。 如何在python中解析这个文件,根据偏移量抓取对应的元素,解压缩(如果它的格式是gzip)并将其存储为文件?
嗯,根据 OmnipotentEntity 和 Jakob_B 的回复,我制作了以下简短的脚本,看看它是否适用于第一个元素:
import zlib
f = open("file.xml", "r")
text = f.read()
position = text.find("</Package>\n")
headerSize=position+ len("</Package>\n") + 1
offset=0
f.seek(headerSize + offset)
length = 2961181
bin_data = f.read(length)
zipped=1
if (zipped):
ungziped_str = zlib.decompressobj().decompress('x\x9c' + bin_data)
print(ungziped_str)
f.close()
但是,我收到以下错误:
Traceback(最近一次调用最后一次): 文件“file_parse.py”,第 11 行,在? ungziped_str = zlib.decompressobj().decompress('x\x9c' + bin_data) zlib.error: 解压时出错 -3: 无效的块类型
有什么问题?输入文件不正确,还是代码不正确?
【问题讨论】:
-
如果我在您的测试 XML(在 XML 之后具有 BINARY_DATA 的那个)上运行它并设置 length=10 进行测试,我会得到“INARY_DATA”。请记住,编程中只有三种类型的错误:意外输入和非一错误。
-
谢谢你,Spacedman,一个错误,我改为 headerSize=position+ len("\n"),但还有另一个错误:ungziped_str = zlib.decompressobj() .decompress('x\x9c' + bin_data) zlib.error: Error -3 while decompressing: invalid stored block lengths
-
如果我们没有文件可玩,可能很难调试。最好不要太大。
标签: python parsing file binary-data