【问题标题】:Convert string with [key]:[value] to dictionary将带有 [key]:[value] 的字符串转换为字典
【发布时间】:2020-07-21 00:51:52
【问题描述】:

我正在尝试将以下字符串(多行)转换为 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))

使用这种方法,有时我会错过一些键:值。我正在寻找一种更简单的方法来转换它。

假设我们的字符串在一个 [key] 之间有一个换行符:\n [value]

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': ''
}

注意:由于同一 key:value 之间有多个 \n,它将缺少 'persist.sys.boot.reason.history' 属性。 persist.sys.boot.reason 也没有被转换。不知道为什么。

【问题讨论】:

  • 显示代码,显示出错的案例。
  • 您提供的代码显示提供的数据样本没有失败。顺便说一句,最好避免使用from re import compile,而是坚持使用import re,然后使用re.compile()。确实,compile 已经是 Python 内置函数了。
  • 我认为你应该先发布一个有意义的问题。请通读stackoverflow.com/help/how-to-ask 并尝试按照说明进行操作。这里的 cmets 也很有用。
  • 有一个re.S == re.DOTALL 标志。你可能正在寻找那个。它将换行符与. 匹配。我会在重新打开后立即发布答案。
  • 是的。还有两个人必须投票才能重新开放。这就是为什么我建议删除和重新发布,但在这一点上这将是一个坏主意。我们将不得不等待。

标签: python regex python-3.x dictionary


【解决方案1】:

这个单行应该做到。

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')

上述方法与answer 中采用的方法类似。

【讨论】:

    猜你喜欢
    • 2014-06-07
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多