使用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
return
将dictionary
变成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字符串与字典互相转换