Преобразовать строку с [ключ]: [значение] в словарь - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь преобразовать следующую строку (MULTI LINE) в словарь в python3 +:

props_str ="
[persist.sys.bootupvolume]: [0]
[persist.sys.dalvik.vm.lib.2]: [li]
[persist.sys.device_provisioned]: [1]
[persist.sys.displayinset.top]: [0]
[persist.sys.isolated_storage]: [true]
[persist.sys.locale]: [en-US]
[persist.sys.phonelock.mode]: [0]
[persist.sys.sf.color_saturation]: [1.0]
[persist.sys.sf.native_mode]: [1]
[persist.sys.timezone]: []"

В настоящее время я использую регулярное выражение, чтобы преобразовать указанное выше выражение в список, а затем преобразовать список в словарь.

c = compile(r"\[(.*?)\]")
props_list = c.findall(props_str)

it = iter(props_list)
prop_dict = dict(zip(it, it))

При использовании этого метода иногда я пропускаю ключ: значение. Я ищу более простой способ конвертировать это.

Давайте предположим, что наша строка имеет один разрыв строки между одним [ключом]: \ n [значение]

props_str ="\
[persist.sys.bootupvolume]: [0]\
[persist.sys.dalvik.vm.lib.2]: [li]\
[persist.sys.device_provisioned]: [1]\
[persist.sys.displayinset.top]: [0]\
[persist.sys.isolated_storage]: [true]\
[persist.sys.locale]: \
[en-US]\
[persist.sys.phonelock.mode]: [0]\
[persist.sys.sf.color_saturation]: [1.0]\
[persist.sys.sf.native_mode]: [1]\
[persist.sys.timezone]: []\
[persist.sys.boot.reason]: []\
[persist.sys.boot.reason.history]: [reboot,hardware_reset,4831146 \
reboot,ota,1586292448 \
bootloader,4766793  \
reboot,4766775]"

Вывод будет :

{
   'persist.sys.bootupvolume': '0',
   'persist.sys.dalvik.vm.lib.2': 'li', 
   'persist.sys.device_provisioned': '1', 
   'persist.sys.displayinset.top': '0', 
   'persist.sys.isolated_storage': 'true', 
   'persist.sys.locale': 'en-US', 
   'persist.sys.phonelock.mode': '0', 
   'persist.sys.sf.color_saturation': '1.0', 
   'persist.sys.sf.native_mode': '1', 
   'persist.sys.timezone': ''
}

Примечание: будет отсутствовать свойство 'persist.sys.boot.reason.history' ie из-за множества \ n между одним и тем же ключом: значением. Также persist.sys.boot.reason также не был преобразован. Не знаю почему.

1 Ответ

1 голос
/ 09 апреля 2020

Этот однострочник должен делать это.

prop_dict = dict((k[1: -1], v[1: -1]) for k, v in (item.split(': ') for item in props_str.split('\n')[1:]))

Предполагается, что между каждой парой ключ-значение есть разрыв строки.

Предполагается также, что первая строка не начинается с пары ключ-значение. Если это так, просто замените props_str.split('\n')[1:] на props_str.split('\n').

Подход, описанный выше, аналогичен подходу, принятому в этом ответе .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...