python 二进制Plist文件转Xml格式Plist
来源:互联网 发布:数据库mandatory 编辑:程序博客网 时间:2024/06/12 22:14
#获取字段类型def gettype(value): if isinstance(value,int): if isinstance(value,bool): return 'bool' return 'integer' elif isinstance(value,bytes): try: buff=value.decode('utf-8')#这个txt 随便写的了 txt='stringa' except: try: buff=value.decode('utf-16') txt='stringb' except: pass return txt elif isinstance(value,str): return 'string' elif isinstance(value,list): return 'array' elif isinstance(value,dict): return 'dict' else: return 'Error Type:'+str(type(value))#转成str型,比较方便后面使用def tostr(key): keytype=gettype(key) if keytype=='stringa': return key.decode('utf-8') elif keytype=='stringb': return key.decode('utf-16') elif keytype=='string': #声明全局变量 global strID global strDict strDict[strID]=key strID=strID+1 return str.format('%04d' % (strID-1)) return key elif keytype=='integer': return str(key) elif keytype=='bool': if key==True: return 'true' else: return 'false' else: return 'Unknow Type Return!' #字典转字符def dict2str(dictx): global gtab buff='' tabs=gettabs() buff=buff+tabs+'<dict>\n' gtab=gtab+1 tabs=gettabs() for key in dictx: buff=buff+tabs+'<key>'+tostr(key)+'</key>\n' buff=buff+tabs value=dictx[key] valuetype=gettype(value) if valuetype=='dict': buff=buff+dict2str(value) elif valuetype=='array': buff=buff+list2str(value) elif valuetype=='bool': buff=buff+'<'+tostr(value)+'/>\n' else: if valuetype=='stringa' or valuetype=='stringb': valuetype='string' buff=buff+'<'+valuetype+'>'+tostr(value)+'</'+valuetype+'>\n' gtab=gtab-1 tabs=gettabs() buff=buff+tabs buff=buff+'</dict>\n' return buff#列表在plist的xml格式里为arraydef list2str(listx): global gtab buff='' tabs=gettabs() buff=buff+tabs+'<array>\n' gtab=gtab+1 tabs=gettabs() for value in listx: valuetype=gettype(value) if valuetype=='dict': buff=buff+dict2str(value) elif valuetype=='array': buff=buff+list2str(value) else: print('list ') gtab=gtab-1 tabs=gettabs() buff=buff+tabs+'</array>\n' return buff#缩进距离,排版xml,代码很乱。。。。。欢迎拍砖def gettabs(): buff='' for i in range(gtab): buff=buff+'\t' return buff def exporttxt(fn): plist=biplist.readPlist(fn) buff=dict2str(plist) fp=open(fn[:-5]+'src','w',encoding='utf-8') temp='''<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0">\n''' fp.write(temp) fp.write(buff) fp.write('</plist>') fp.close() if __name__=='__main__': import glob import os import biplist strID=0 strDict={} files=glob.glob('*.plist') for fn in files: if os.path.isfile(fn): #全局变量 字符串ID strID=0 strDict={} gtab=0 exporttxt(fn) print('Over!')