簡體   English   中英

Python3釋放字節對象的字符串表示形式

[英]Python3 unpickle a string representation of bytes object

有沒有一種好的方法來加載表示為字符串的字節對象,以便可以將其取消腌制?

基本范例

這是一個愚蠢的例子:

import pickle

mydict = { 'a': 1111, 'b': 2222 }
string_of_bytes_obj = str(pickle.dumps(mydict)) # Deliberate string representation for this quick example.

unpickled_dict = pickle.loads(string_of_bytes_obj) # ERROR!  Loads takes bytes-like object and not string.

嘗試解決方案

一種解決方案當然是eval字符串:

unpickled_dict = pickle.loads(eval(string_of_bytes_obj))

但是, eval似乎是錯誤的,尤其是當字符串可能是通過網絡或來自文件時。

...

有更好的解決方案的建議嗎?

謝謝!

為了安全起見,您可以使用ast.literal_eval而不是eval

>>> import ast
>>> pickle.loads(ast.literal_eval(string_of_bytes_obj))
{'b': 2222, 'a': 1111}

您是否有理由將其作為str? 如果只是將其寫入文件,則可以使用“ wb”代替“ w”。 https://pythontips.com/2013/08/02/what-is-pickle-in-python/

import pickle

mydict = { 'a': 1111, 'b': 2222 }
dumped = pickle.dumps(mydict)
string_of_bytes_obj = str(dumped) # Deliberate string representation for this quick example. 

unpickled_dict = pickle.loads(dumped) 

您可以將encoding="latin1"用作str的參數,然后使用bytes進行轉換:

import pickle

mydict = { 'a': 1111, 'b': 2222 }
string_of_bytes_obj = str(pickle.dumps(mydict), encoding="latin1")

unpickled_dict = pickle.loads(bytes(string_of_bytes_obj, "latin1"))

輸出:

>>> print(unpickled_dict)
{'a': 1111, 'b': 2222}

首先,我不會使用泡菜來序列化數據。 而是使用Json。

我用泡菜的解決方案

import pickle

mydict = { 'a': 1111, 'b': 2222 }
string_of_bytes_obj = pickle.dumps(mydict) # Deliberate string representation for this quick example.
print(string_of_bytes_obj)
unpickled_dict = pickle.loads(string_of_bytes_obj)
print(unpickled_dict)

但是帶有json

import json

mydict = { 'a': 1111, 'b': 2222 }
string_of_bytes_obj = json.dumps(mydict) 
print(string_of_bytes_obj)
unpickled_dict = json.loads(string_of_bytes_obj)
print(unpickled_dict)

我強烈建議您使用json序列化數據

暫無
暫無

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

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