plist не видит код plist файла
Программирую на питоне. Пишу программу для переработки файла и столкнулся с проблемой. Встроенная библиотека plistlib наотрез отказывается видеть хоть что то в коде. Она возвращает просто пустой словарь.
Вот код plist файла (он в одну строку)
<?xml version="1.0"?><plist version="1.0" gjver="2.0"><dict><k>LLM_01</k><d><k>_isArr</k><t /><k>k_0</k><d><k>kCEK</k><i>4</i><k>k2</k><s>Unnamed 0</s><k>k4</k><s>H4sIAAAAAAAAC6WQwXEDIQxFG1Jm9AUCdnJyDS5ABbiFFB-DyGEjWDuTC395fB4sj3tqBMtsYhC1ZKJqgId4OMz2ASsGZrZqMGgfmrE1wxdsKFjeU-D_imOp6B3f8JZErO9fifpr_Ij4lUa3Gv7LbcpGQ48bEnEP9SgemZ6jf1cnM1qPezrGTMbogrFwy2P0VbAHiD9BICEcSonAep4nJXkC5nzmJfAy9y_7dV0PWGR96uTh1MmPwPWSR0_b9NtlP_xtqmtPwobny344d_YjrxuO9Xu6p7_emWde32fy4M_pkkdP2fTLpn_85t-oKs3OvQQAAA==</s><k>k5</k><s>Player</s><k>k13</k><t /><k>k21</k><i>2</i><k>k16</k><i>1</i><k>k80</k><i>53</i><k>k50</k><i>35</i><k>k47</k><t /><k>k48</k><i>29</i><k>kI1</k><r>-41.8</r><k>kI2</k><r>4.97752</r><k>kI3</k><r>0.6</r><k>kI6</k><d><k>0</k><s>0</s><k>1</k><s>0</s><k>2</k><s>0</s><k>3</k><s>0</s><k>4</k><s>0</s><k>5</k><s>0</s><k>6</k><s>0</s><k>7</k><s>0</s><k>8</k><s>0</s><k>9</k><s>0</s><k>10</k><s>0</s><k>11</k><s>0</s><k>12</k><s>0</s></d></d></d><k>LLM_02</k><i>35</i></dict></plist>
Подскажите пожалуйста что делать с библиотекой.
Ответы (2 шт):
Автор решения: Namerek
→ Ссылка
Надеюсь что это Вам поможет:
pip install xmltodict
from pprint import pprint
from typing import Iterable
from xmltodict import parse
plist_text = '<?xml version="1.0"?><plist version="1.0" gjver="2.0"><dict><k>LLM_01</k><d><k>_isArr</k><t /><k>k_0</k><d><k>kCEK</k><i>4</i><k>k2</k><s>Unnamed 0</s><k>k4</k><s>H4sIAAAAAAAAC6WQwXEDIQxFG1Jm9AUCdnJyDS5ABbiFFB-DyGEjWDuTC395fB4sj3tqBMtsYhC1ZKJqgId4OMz2ASsGZrZqMGgfmrE1wxdsKFjeU-D_imOp6B3f8JZErO9fifpr_Ij4lUa3Gv7LbcpGQ48bEnEP9SgemZ6jf1cnM1qPezrGTMbogrFwy2P0VbAHiD9BICEcSonAep4nJXkC5nzmJfAy9y_7dV0PWGR96uTh1MmPwPWSR0_b9NtlP_xtqmtPwobny344d_YjrxuO9Xu6p7_emWde32fy4M_pkkdP2fTLpn_85t-oKs3OvQQAAA==</s><k>k5</k><s>Player</s><k>k13</k><t /><k>k21</k><i>2</i><k>k16</k><i>1</i><k>k80</k><i>53</i><k>k50</k><i>35</i><k>k47</k><t /><k>k48</k><i>29</i><k>kI1</k><r>-41.8</r><k>kI2</k><r>4.97752</r><k>kI3</k><r>0.6</r><k>kI6</k><d><k>0</k><s>0</s><k>1</k><s>0</s><k>2</k><s>0</s><k>3</k><s>0</s><k>4</k><s>0</s><k>5</k><s>0</s><k>6</k><s>0</s><k>7</k><s>0</s><k>8</k><s>0</s><k>9</k><s>0</s><k>10</k><s>0</s><k>11</k><s>0</s><k>12</k><s>0</s></d></d></d><k>LLM_02</k><i>35</i></dict></plist>'
def od_to_dict(obj, **kwargs):
from typing import Mapping
if isinstance(obj, Mapping):
obj = dict(obj)
for key, value in obj.items():
obj[key] = od_to_dict(value)
elif isinstance(obj, str):
return obj
elif isinstance(obj, Iterable):
return list(map(od_to_dict, obj))
return obj
pprint(
od_to_dict(
parse(
plist_text
)
)
)
Если не использовать дописанную od_to_dict то на выходе получите обычный OrderedDict
{'plist': {'@gjver': '2.0',
'@version': '1.0',
'dict': {'d': {'d': {'d': {'k': ['0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'10',
'11',
'12'],
's': ['0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0',
'0']},
'i': ['4', '2', '1', '53', '35', '29'],
'k': ['kCEK',
'k2',
'k4',
'k5',
'k13',
'k21',
'k16',
'k80',
'k50',
'k47',
'k48',
'kI1',
'kI2',
'kI3',
'kI6'],
'r': ['-41.8', '4.97752', '0.6'],
's': ['Unnamed 0',
'H4sIAAAAAAAAC6WQwXEDIQxFG1Jm9AUCdnJyDS5ABbiFFB-DyGEjWDuTC395fB4sj3tqBMtsYhC1ZKJqgId4OMz2ASsGZrZqMGgfmrE1wxdsKFjeU-D_imOp6B3f8JZErO9fifpr_Ij4lUa3Gv7LbcpGQ48bEnEP9SgemZ6jf1cnM1qPezrGTMbogrFwy2P0VbAHiD9BICEcSonAep4nJXkC5nzmJfAy9y_7dV0PWGR96uTh1MmPwPWSR0_b9NtlP_xtqmtPwobny344d_YjrxuO9Xu6p7_emWde32fy4M_pkkdP2fTLpn_85t-oKs3OvQQAAA==',
'Player'],
't': [None, None]},
'k': ['_isArr', 'k_0'],
't': None},
'i': '35',
'k': ['LLM_01', 'LLM_02']}}}
Автор решения: Paranoik YT
→ Ссылка
Самым простым решением оказалось решение в лоб. Я просто заменяю все короткие теги на их длинные версии и получаю нужный мне словарь.
В переменной text находится код строки.
text = text.replace('k>', 'key>').replace('d>', 'dict>').replace('s>', 'string>').replace('r>', 'real>')
text = text.replace('<t />', '<true/>').replace('<f />', '<false/>').replace('i>', 'integer>')