如何将字典的键和值从字节转换为字符串?



我有一个编码格式的字典。可以有嵌套字典,但我不知道它可以嵌套多少。

数据样本如下图

1:{
b'key1':{
b'key11':2022,
b'key12':1,
b'key13':2022,
b'key32':1,
b'key14':b'x86xe3x88',
b'key21':b'U_001776',
b'key34':b'xe6xb4xbexe9x81xa3xe7xa4xbexe5x93xa1',
b'key65':b'U_001506',
b'key45':b'xbc',
b'key98':b'1x81x88'b'kwy66':{
b'keyq':b'sometext'
}
}
},

将其转换为字符串我试过这个


def convert_dict(data):
if isinstance(data,str):
return data
elif isinstance(data,bytes):
return data.decode()
elif isinstance(data,dict):
for key,val in data.items():
if isinstance(key,bytes):
data[key.decode()] = convert_dict(data[key])
else:
data[key] = convert_dict(data[key])
return data
elif isinstance(data,list):
temp_list = []
for dt in data:
temp_list.append(convert_dict(dt))
return temp_list
else:
return data

我得到了dictionary changed size during iteration。这里面有什么错误吗?请帮助。

Edit1 .

数据实际上是在php中序列化的,我不得不使用python来反序列化。我用This在Dictionary中转换它

from phpserialize import *
temp = loads(serialized_data.encode())

我收到一个字典,但是它的键和值是编码的。我必须使用serialized_data.encode(),因为加载将接受字节数据类型。我将这个temp传递给convert_dict函数。

你不能在迭代时修改dict中的键集(在迭代时基本上修改任何集合是不安全的,但是dicts,不像其他一些,需要做一些自检以避免崩溃如果你违反了该规则,所以当他们在它时,他们会引发一个异常,而不是默默地做一些奇怪的事情)。因此,构建一个新的dict并返回它:

def convert_dict(data):
if isinstance(data,str):
return data
elif isinstance(data,bytes):
return data.decode()
elif isinstance(data,dict):
newdata = {}  # Build a new dict
for key, val in data.items():
# Simplify code path by just doing decoding in conditional, insertion unconditional
if isinstance(key,bytes):
key = key.decode()
newdata[key] = convert_dict(val)  # Update new dict (and use the val since items() gives it for free)
return newdata
elif isinstance(data,list):
return [convert_dict(dt) for dt in data]
else:
return data

只是为了好玩,我做了一些小的修改来减少代码重复,这样大多数工作都是通过公共路径完成的,并演示了用listcomp简化list的情况。

您不能更改正在遍历的字典。最好返回一个新的结构:

def convert(d):
if isinstance(d, dict):
return {convert(k): convert(v) for k, v in d.items()}
if isinstance(d, list):
return [convert(i) for i in d]
if isinstance(d, bytes):
return d.decode()
return d

最新更新