【问题标题】:Useful way to convert string to dictionary using python使用python将字符串转换为字典的有用方法
【发布时间】:2025-12-11 07:30:01
【问题描述】:

我有以下string 作为输入:

'name SP2, status Online, size 4764771 MB, free 2576353 MB, path /dev/sde, log 210 MB, port 5660, guid 7478a0141b7b9b0d005b30b0e60f3c4d, clusterUuid -8650609094877646407--116798096584060989, disks /dev/sde /dev/sdf /dev/sdg, dare 0'

我编写了使用python 将其转换为dictionary 的函数:

def str_2_json(string):
    str_arr = string.split(',')
    #str_arr{0} = name SP2
    #str_arr{1} = status Online
    json_data = {}
    for i in str_arr:
        #remove whitespaces
        stripped_str = " ".join(i.split())  # i.strip()
        subarray = stripped_str.split(' ')
        #subarray{0}=name
        #subarray{1}=SP2
        key = subarray[0] #key: 'name'
        value = subarray[1] #value: 'SP2'
        json_data[key] = value
        #{dict 0}='name': SP2'
        #{dict 1}='status': online'
    return json_data

returndictionary 变成json(它有jsonfiy)。

有没有一种简单/优雅的方法可以做得更好?

【问题讨论】:

  • 这些值中的任何一个都可以嵌入逗号吗?如果可以,是否以某种方式转义?首先对字符串进行编码的规则是什么?
  • 这在我得到的输入中,我无法改变它,所以我只能使用它
  • 但问题是关于创建数据的规则。有很多问题,比如一个字段是否可以嵌入逗号,像name 这样的单值事物是否在列表中,disks 是否应该始终在列表中等等......

标签: json python-3.x string dictionary converters


【解决方案1】:

你可以用正则表达式做到这一点

import re

def parseString(s):
    dict(re.findall('(?:(\S+) ([^,]+)(?:, )?)', s))

sample = "name SP1, status Offline, size 4764771 MB, free 2406182 MB, path /dev/sdb, log 230 MB, port 5660, guid a48134c00cda2c37005b30b0e40e3ed6, clusterUuid -8650609094877646407--116798096584060989, disks /dev/sdb /dev/sdc /dev/sdd, dare 0"

parseString(sample)

输出:

{'name': 'SP1',
 'status': 'Offline',
 'size': '4764771 MB',
 'free': '2406182 MB',
 'path': '/dev/sdb',
 'log': '230 MB',
 'port': '5660',
 'guid': 'a48134c00cda2c37005b30b0e40e3ed6',
 'clusterUuid': '-8650609094877646407--116798096584060989',
 'disks': '/dev/sdb /dev/sdc /dev/sdd',
 'dare': '0'}

【讨论】:

    【解决方案2】:

    你的方法很好,除了一些奇怪的事情:

    • 您没有创建任何JSON,因此为避免混淆,我建议您不要将返回的字典命名为json_data 或函数str_2_json。 JSON,或 JavaScript Object Notation 就是这样 - 表示对象的标准作为文本。对象本身与 JSON 无关。
    • 您可以使用 i.strip() 而不是加入拆分后的字符串(不知道为什么要这样做,因为您注释掉了 i.strip()
    • 您的某些值包含多个空格(例如"size 4764771 MB""disks /dev/sde /dev/sdf /dev/sdg")。通过您的代码,您将在此类字符串中的第二个空格之后结束所有内容。为避免这种情况,请执行stripped_str.split(' ', 1),这会限制您要拆分字符串的次数。

    除此之外,您可以使用dict() 构造函数和生成器表达式在一行中创建字典:

    def str_2_dict(string):
        data = dict(item.strip().split(' ', 1) for item in string.split(','))
        return data
    
    print(str_2_dict('name SP2, status Online, size 4764771 MB, free 2576353 MB, path /dev/sde, log 210 MB, port 5660, guid 7478a0141b7b9b0d005b30b0e60f3c4d, clusterUuid -8650609094877646407--116798096584060989, disks /dev/sde /dev/sdf /dev/sdg, dare 0'))
    

    输出:

    {
     'name': 'SP2',
     'status': 'Online',
     'size': '4764771 MB',
     'free': '2576353 MB',
     'path': '/dev/sde',
     'log': '210 MB',
     'port': '5660',
     'guid': '7478a0141b7b9b0d005b30b0e60f3c4d',
     'clusterUuid': '-8650609094877646407--116798096584060989',
     'disks': '/dev/sde /dev/sdf /dev/sdg',
     'dare': '0'
    }
    

    这可能与写出完整的循环相同(实际上,就效率/时间而言):

    def str_2_dict(string):
        data = dict()
        for item in string.split(','):
            key, value = item.strip().split(' ', 1) 
            data[key] = value
        return data
    

    【讨论】:

    • 谢谢!这正是我想要的
    【解决方案3】:

    假设这些字段不能包含内部逗号,您可以使用re.split 来拆分和删除周围的空格。看起来您有不同类型的字段,应该以不同方式处理。我添加了一个基于字段名称的模式处理程序的猜测,它可以用作根据需要转换各种字段的模板。

    如其他地方所述,没有 json,所以不要使用该名称。

    import re
    
    test = 'name SP2, status Online, size 4764771 MB, free 2576353 MB, path /dev/sde, log 210 MB, port 5660, guid 7478a0141b7b9b0d005b30b0e60f3c4d, clusterUuid -8650609094877646407--116798096584060989, disks /dev/sde /dev/sdf /dev/sdg, dare 0'
    
    def decode_data(string):
        str_arr = re.split(r"\s*,\s*", string)
        data = {}
        for entry in str_arr:
            values = re.split(r"\s+", entry)
            key = values.pop(0)
            # schema processing
            if key in ("disks"): # multivalue keys
                data[key] = values
            elif key in ("size", "free"): # convert to int bytes on 2nd value
                multiplier = {"MB":10**6, "MiB":2**20} # todo: expand as needed
                data[key] = int(values[0]) * multiplier[values[1]]
            else:
                data[key] = " ".join(values)
        return data
    
    decoded = decode_data(test)
    for kv in sorted(decoded.items()):
        print(kv)
    

    【讨论】:

      【解决方案4】:
      import json
      
      json_data = json.loads(string)
      

      【讨论】:

      • 我澄清了这个问题。我的输入不是json string,而只是string