2017-11-15 9 views
0

私は、Pythonでオブジェクトをピクルするためのコードを見て、書きました。しかし、彼らはすべてデータを含む物理ファイルを作成します。私は、データをメモリに書き込んでそれを読んで、それをピクルスして転送したいと思います。物理ファイルではなく、メモリ内のPythonオブジェクトをpickleできますか?

それは可能ですか?

from PIL import ImageGrab 
import io 
import codecs 
import pickle 


# Model class to send Process Data to the server 
class ProcessData: 
process_id = 0 
project_id = 0 
task_id = 0 
start_time = 0 
end_time = 0 
user_id = 0 
weekend_id = 0 

# Model class to send image data to the server 
class ProcessScreen: 
process_id = 0 
image_data = bytearray() 


image_name = "Dharmindar_screen.jpg" 
ImageGrab.grab().save(image_name,"JPEG") 

image_data = None 
with codecs.open(image_name,'rb') as image_file: 
image_data = image_file.read() 



serialized_process_data = io.BytesIO() 

process_data = ProcessData() 
process_data.process_id = 1 
process_data.project_id = 2 
process_data.task_id = 3 
process_data.user_id = 4 
process_data.weekend_id = 5 
process_data.start_time = 676876 
process_data.end_time = 787987 

process_screen = ProcessScreen() 
process_screen.process_id = process_data.process_id 
process_screen.image_data = image_data 


prepared_process_data = (process_data, process_screen) 

process_data_serializer = pickle.Pickler() 
process_data_serializer(serialized_process_data).dump(prepared_process_data) 

print('Data serialized.') 


if process_data_serializer is not None: 
    d = process_data_serializer.getvalue() 
    deserialized_data = None 
    with open(d, 'rb') as serialized_data_file: 
     process_deserializer = pickle.Unpickler(serialized_data_file) 
     deserialized_data = process_deserializer.load() 
else: 
    print('Empty') 

上記のコードは、例外TypeError:必要な引数 'ファイル'(POS 1)が見つからない

+1

RAMに書き込むのですか?オブジェクトを他のPythonコードに送信したいのであれば、それを単にパラメータとして渡すことができます。何を達成しようとしていますか? – Shayn

+0

私は単にSocketを通してサーバーにデータを送ろうと思っています。そのためには、私はオブジェクトをピクルする必要があります。しかし、私はすべてのコードを見てきましたが、最初にオブジェクトをバイト形式でファイルに書き込んでから、そのファイルから再度取得すると言います。私は物理的にファイルを書き込むのではなく、メモリでそれをやりたい。 – Dharmindar

+1

バッファインスタンスを提供するStringIOオブジェクトを使用できますが、実際に何をしようとしているのかをShaynが言っているので、 –

答えて

3

あなたはpickle.dumpに渡すFileオブジェクトがちょうどwriteメソッドを必要とし、https://docs.python.org/2/library/pickle.html#pickle.dump

file must have a write() method that accepts a single string argument. It can thus be a file object opened for writing, a StringIO object, or any other custom object that meets this interface.

を見ます

StringIOオブジェクトを使用する代わりに、ピクルスデータを格納する独自のクラスを作成することもできます。たとえば、

class MyFile(object): 
    def __init__(self): 
     self.data = [] 
    def write(self, stuff): 
     self.data.append(stuff) 

、その後、ちょうどこのクラスのインスタンスに酸洗い:

class ExampleClass(object): 
    def __init__(self, x): 
     self.data = x 
a = ExampleClass(123) 
f = MyFile() 
pickle.dump(a, f) 

別のオプションは、@rawingによって提案されているように、hereを比較し、直接使用できる文字列を返しますどのpickle.dumpsを使用することです。

+0

あなたの方法は間違いなく動作します。しかし、私は単純なものを探していました。@ Rawingは質問にコメントし、pickle.dumpの代わりにpickle.dumpsを使用するべきだと示唆しました。 – Dharmindar

関連する問題