我有編碼格式的字典。可以有嵌套字典,我沒有關于它可以嵌套多少的資訊。
資料樣本如下所示
1:{
b'key1':{
b'key11':2022,
b'key12':1,
b'key13':2022,
b'key32':1,
b'key14':b'x86\xe3\x88',
b'key21':b'U_001776',
b'key34':b'\xe6\xb4\xbe\xe9\x81\xa3\xe7\xa4\xbe\xe5\x93\xa1',
b'key65':b'U_001506',
b'key45':b'\xbc',
b'key98':b'1\x81\x88'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。這有什么錯誤嗎?請幫忙。
編輯1。
資料實際上是在 php 中序列化的,我不得不使用 python 來反序列化。我用這個在字典中轉換它。
from phpserialize import *
temp = loads(serialized_data.encode())
我收到了字典,但它的鍵和值是編碼的。我不得不使用 serialized_data.encode() 因為加載將接受位元組資料型別。我將此 temp 傳遞給 convert_dict 函式。
uj5u.com熱心網友回復:
您不能在迭代時修改鍵集(在dict迭代時修改基本上任何集合都是不安全的,但是與其他一些集合不同,如果您違反該規則,則dict需要進行一些自我檢查以避免崩潰,所以雖然他們在做這件事,他們提出了一個例外,而不是默默地做一些古怪的事情)。所以建立一個新的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
只是為了好玩,我做了一些小的修改以減少代碼重復,所以大部分作業都是通過公共路徑完成的,并演示了list使用 listcomp 簡化案例。
uj5u.com熱心網友回復:
您無法更改正在迭代的字典。最好回傳一個新結構:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/471980.html
