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一起使用。
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')