用python作为plist或zip读写二进制数据

问题描述 投票:0回答:1

File.pk基本上是base64 + zip的容器,我需要在python中导入,将其拆分并提取。文件名是original.plist,因此file.pk =路径+名称+ original.plist的数据。

我找不到open()或codecs.open()的任何有效编码,无法将其作为str打开并保存输出。我总是有一个生成的output.plist,它在校验和和大小方面大于原始文件(大于原始文件)。

我已经使用的编码包括ASCII; UTF-8、16、32;拉丁语_1; ISO-8859-1;

我还尝试过使用zipfile作为一个简单的zip来打开,读取和写入它,并且它可以给出正确的output.plist。

import codecs, os

with open('file.pk', 'r', encoding='Latin_1') as z:
    f_open = z.read()

with codecs.open('file.pk', 'r', encoding='zip') as z:
    f_open = z.read()

f2=f_open[3:] #SKIP DUMMY PART
f3=f2.split('-DATA-')
f4=f3[1].split('-COMMENT-')
#f_out is a str of plist, cannot print() it within sh
with open('output.plist', 'w') as f:
    print(f_out, file=f)

输出与用zip压缩并用十六进制填充修改以产生file.pk的file.zip不同。

original.plist = 5e03964972def5b83880397b7377e6d1aea33e2b

output.plist = 6473aea0ae8bc75a04859effe1ee366de4cdd2d2

作为对both files的深入文件分析的结果,该plist无法使用。

一些缺少的字符也是Unicode PUA(专用区域)。

编辑2

我可以在open()中使用'rb'和'wb',在pickle.dump(input,output)中使用pickle。问题是已写入b.plist的多余字节b''使其无法与sys一起使用。

python encoding binary plist
1个回答
0
投票
with open('file.pk', 'rb') as f:
    f_open = f.read()

# do something with bytes here

with open('p.temp', 'wb') as f:
    pickle.dump(f_bytes, f) # temp file

# reload temp file
with open("p.temp", 'rb') as f:
    data = f.read()

# skip encodings and skip unwanted bytes
data = data[4:-3]

# save it
with open('p.plist', 'wb') as f:
    f.write(data)

os.remove('p.temp')
© www.soinside.com 2019 - 2024. All rights reserved.