簡體   English   中英

如何將包含字典列表的字符串轉換為DICT的python(object)LIST

[英]How to convert string containing list of dictionaries to python (object) LIST of DICT

我使用python套接字接收值作為字符串,並希望將值存儲在SQLite DB中作為字典關鍵字,以列和值作為行。

因此,出於此目的,我無法將字符串轉換為字典-

ReceivedValue = [{'Value1': 'OutPut00', 'Value2': 'OutPut01', 'Value3': '2253.23'},{'Value1': 'NA', 'Value3': 'NA'}]

ReceivedValue始終返回str type而不是list並阻止我進一步處理以添加到SQLite DB中。

如何將接收到的值轉換為字典或詞典列表?

Json Approach編輯:1-附加了Json Error所需的屏幕截圖 在此處輸入圖片說明

評估方法編輯:2-

def process(ReceivedValue):
     print ReceivedValue
     finVal = ast.literal_eval(ReceivedValue)
     print finVal
     print type(finVal)

輸出-

"[{'APACHE_MODJK': '1.2.41', 'PROCESSOR_MODEL': ' Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz', 'APACHE_HOME': '/opt/www/apache/2.4.17', 'OS_KERNEL': '2.6.32-573.26.1.el6.x86_64', 'APACHE_SSO': 'YES', 'TOMCAT_VER': 'NA', 'ENV': 'PROD', 'APACHE': 'RUNNING', 'JBOSS_HOME': '/opt/www/jboss/4.3/jboss-as', 'APACHE_VIP': 'NA', 'CPU': 2, 'OS_VER': 'Red Hat Enterprise Linux Server release 6.7 (Santiago)', 'TOMCAT_DB': 'NA', 'SAN': 'NA', 'JBOSS_DB': 'p377', 'MEMORY': 4, 'JBOSS_VER': '4.3.0.GA_CP02', 'JDK_VER': '1.6.0_18', 'APACHE_VER': '2.4.17', 'MACHINE_TYPE': 'VMware Virtual Platform'}]"
[{'APACHE_MODJK': '1.2.41', 'PROCESSOR_MODEL': ' Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz', 'APACHE_HOME': '/opt/www/apache/2.4.17', 'OS_KERNEL': '2.6.32-573.26.1.el6.x86_64', 'APACHE_SSO': 'YES', 'TOMCAT_VER': 'NA', 'ENV': 'PROD', 'APACHE': 'RUNNING', 'JBOSS_HOME': '/opt/www/jboss/4.3/jboss-as', 'APACHE_VIP': 'NA', 'CPU': 2, 'OS_VER': 'Red Hat Enterprise Linux Server release 6.7 (Santiago)', 'TOMCAT_DB': 'NA', 'SAN': 'NA', 'MEMORY': 4, 'JBOSS_VER': '4.3.0.GA_CP02', 'JDK_VER': '1.6.0_18', 'APACHE_VER': '2.4.17', 'MACHINE_TYPE': 'VMware Virtual Platform'}]
<type 'str'>

解決方法 :只需從ast.literal_eval()刪除雙引號即可在eval()ast.literal_eval()對其進行求值

使用json模塊將其轉換為dict,我猜這是最簡單的。

import json
your_dict = json.loads([{'Value1': 'OutPut00', 'Value2': 'OutPut01', 'Value3': '2253.23'},{'Value1': 'NA', 'Value3': 'NA'}])

使用套接字時,如果要通過套接字發送字節或字符串以外的任何內容,則必須對信息進行序列化和反序列化。 這可以通過多種方式來完成。 一種流行的方法是使用Picklehttps://docs.python.org/3/library/pickle.html ,該庫允許您序列化和反序列化諸如字典和對象之類的信息。 這可以通過dumpload功能來完成。 在將信息發送到套接字之前,只需調用serialized_dict = pickle.dump(dict)然后deserialized_dict = pickle.load(buffer_bytes)即可在另一端反序列化。

然而,已知的是,泡菜功能對於錯誤或惡意構建的數據是不安全的。 此外,建議不要對用戶無法構建的數據(例如用戶輸入)使用酸洗。 處理序列化的另一種方法是使用python https://docs.python.org/3/library/struct.html中的struct對象自行打包和解壓縮緩沖區。 這是一個稍微復雜的方法。 如果需要,我可以詳細介紹一下。 您需要將每個鍵和值對打包到一個緩沖區/字節數組中,然后通過套接字發送,一旦收到,您就需要解壓縮每個鍵和值對,然后在另一側再次構造您的字典。 您需要確保跟蹤緩沖區中每個元素的大小以及緩沖區中有多少項(鍵/值對)的事情

假設ReceivedValue是一個類似下面的字符串(您的示例中沒有引號,使它成為字典列表),則可以使用eval(ReceivedValue)進行轉換。

[適用標准免責聲明]請注意,使用eval有安全隱患-您是否相信要評估的字符串的來源? 評估惡意字符串可能導致其在您的系統上執行代碼。 https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html

>>> ReceivedValue = "[{'Value1': 'OutPut00', 'Value2': 'OutPut01', 'Value3': '2253.23'},{'Value1': 'NA', 'Value3': 'NA'}]"
>>> 
>>> my_list = eval(ReceivedValue)
>>>
>>> my_list
[{'Value1': 'OutPut00', 'Value2': 'OutPut01', 'Value3': '2253.23'}, {'Value1': 'NA', 'Value3': 'NA'}]
>>>
>>> my_list[0]
{'Value1': 'OutPut00', 'Value2': 'OutPut01', 'Value3': '2253.23'}
>>>
>>> my_list[1]
{'Value1': 'NA', 'Value3': 'NA'}
>>> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM