使用python将字符串转换为字典的有用方法

Posted

技术标签:

【中文标题】使用python将字符串转换为字典的有用方法【英文标题】:Useful way to convert string to dictionary using python 【发布时间】:2021-07-28 02:41:48 【问题描述】:

我有以下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_arr0 = name SP2
    #str_arr1 = status Online
    json_data = 
    for i in str_arr:
        #remove whitespaces
        stripped_str = " ".join(i.split())  # i.strip()
        subarray = stripped_str.split(' ')
        #subarray0=name
        #subarray1=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 是否应该始终在列表中等等...... 【参考方案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

以上是关于使用python将字符串转换为字典的有用方法的主要内容,如果未能解决你的问题,请参考以下文章

将字符串转换为字典的简单方法

Python爬虫编程思想(78): JSON字符串与字典互相转换

Python爬虫编程思想(78): JSON字符串与字典互相转换

Python 怎么将列表类字典组字符串转换为列表?

python将字符串转换成字典的几种方法

Python - 如何将类似字典的字符串转换为字典[重复]