簡體   English   中英

編寫pickle.dump輸出到文件

[英]Writing a pickle.dumps output to a file

我有以下代碼:

some_dict = {'a':0, 'b':1}
line = "some_dict_b = %s\n" % pickle.dumps(some_dict,2)
exec(line)
decoded_dict = pickle.loads(some_dict_b)
decoded_dict == some_dict

在python 3中,此代碼顯示True。 在python 2(2.7.8)中,我在exec行中遇到錯誤。 我知道轉儲在2.7中返回str,而在3中返回字節流。

我正在編寫一個程序,該程序從輸入文件中解析數據,然后創建某些內存對象,並應編寫出使用這些對象的python腳本。 我使用pickle.dumps()在腳本文件中寫入這些對象,然后按照上面概述的想法將其插入變量聲明行。 但是我需要能夠在python 2中運行此代碼。

我確實注意到,在python 3中,line變量正確地轉義了每個反斜杠和一個類型:

>>> line
"some_dict_b = b'\\x80\\x02...

而在python 2我得到:

>>> line
'some_dict_b = \x80\x02...

Python的3 bytes類型沒有字符串表示形式,所以,當轉換為一個字符串%s對象表示來代替。 如果要從對象生成與Python兼容的語法,則可以改用%r格式化程序,直接使用表示形式。

在Python 2中:

>>> import pickle
>>> some_dict = {'a':0, 'b':1}
>>> p = pickle.dumps(some_dict, 2)
>>> print 'string: %s\nrepresentation: %r' % (p, p)
string: ?}q(UaqKUbqKu.
representation: '\x80\x02}q\x00(U\x01aq\x01K\x00U\x01bq\x02K\x01u.'

在Python 3中:

>>> import pickle
>>> some_dict = {'a':0, 'b':1}
>>> p = pickle.dumps(some_dict, 2)
>>> print('string: %s\nrepresentation: %r' % (p, p))
string: b'\x80\x02}q\x00(X\x01\x00\x00\x00bq\x01K\x01X\x01\x00\x00\x00aq\x02K\x00u.'
representation: b'\x80\x02}q\x00(X\x01\x00\x00\x00bq\x01K\x01X\x01\x00\x00\x00aq\x02K\x00u.'

對象表示形式( repr()函數的輸出,它使用object.__repr__特殊方法 )通常會嘗試為您提供一種表示形式,該表示形式可以粘貼回Python腳本或交互式提示中以重新創建相同的值。

repr()的文檔中:

對於許多類型,此函數會嘗試返回一個字符串,該字符串在傳遞給eval()時將產生具有相同值的對象,否則表示形式是一個用尖括號括起來的字符串,其中包含對象的類型名稱以及通常包括對象名稱和地址的其他信息。

實際上,這些都不是pickle特有的。

每當您想到“我使用exec”時,請三思。 你不知道 與其像這樣評估數據,不如將數據內容存儲在字典本身中。

然后,將數據顯式分配給變量。

some_dict = {'a':0, 'b':1}
line = pickle.dumps(some_dict)
decoded_dict = pickle.loads(line)
decoded_dict == some_dict

您可以撥打repr將它們插入到前行的字符串或字節的對象。

# Python 2
>>> 'some_dict = %s' % repr(pickle.dumps(d))
'some_dict = "(dp0\\nS\'a\'\\np1\\nI12\\nsS\'b\'\\np2\\nI24\\ns."'

# Python 3
>>> 'some_dict = %s' % repr(pickle.dumps(d))
"some_dict = b'\\x80\\x03}q\\x00(X\\x01\\x00\\x00\\x00bq\\x01K\\x18X\\x01\\x00\\x00\\x00aq\\x02K\\x0cu.'"

或者使用format方法,使用!r自動調用repr

>>> 'some_dict = {!r}'.format(pickle.dumps(d))
"some_dict = b'\\x80\\x03}q\\x00(X\\x01\\x00\\x00\\x00bq\\x01K\\x18X\\x01\\x00\\x00\\x00aq\\x02K\\x0cu.'"

(也適用於python 2)

暫無
暫無

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

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