피클을 사용하여 받아쓰기를 저장하려면 어떻게해야합니까?


370

파이썬 문서가 제공 하는 정보를 살펴 보았지만 여전히 약간 혼란 스럽습니다. 누군가 새 파일을 작성한 다음 pickle을 사용하여 사전을 덤프하는 샘플 코드를 게시 할 수 있습니까?


5
이것을 통해 읽으십시오 : doughellmann.com/PyMOTW/pickle 그리고 특정한 질문이 필요할 때 다시 오세요
pyfunc

2
-1 이전 의견을 참조하십시오. 시도 해봐. 그런 다음 효과가없는 경우 (항상 그런 것은 아님), 지시 된 질문을 구성 할 수 있습니다 (가설을 시험하거나 "질문 할 수있는 가설"또는 다른 질문과 함께 다른 사람에게 질문하기 전에). 예를 들어 구문 오류가 있었습니까? 예외? 값이 왜곡 ​​되었습니까?

1
파이 게임에서 정보를 저장하기 위해 이것을 사용하려고했습니다. 위의 정보를 사용했으며 코드는 다음과 같습니다.
Chachmu

name = raw_input ( '입력 파일 이름 :') tf = open (name + '. pkl', 'wb') pickle.dump (total, tf) tf.close ()
Chachmu

2
표면 객체를 피클하는 방법에 대한 새로운 질문을해야합니다
John La Rooy

답변:


727

이 시도:

import pickle

a = {'hello': 'world'}

with open('filename.pickle', 'wb') as handle:
    pickle.dump(a, handle, protocol=pickle.HIGHEST_PROTOCOL)

with open('filename.pickle', 'rb') as handle:
    b = pickle.load(handle)

print a == b

4
@ houbysoft : 왜 제거 pickle.HIGHEST_PROTOCOL했습니까?
Blender

37
@Blender :이 수준의 질문에는 관련이없고 불필요하게 복잡합니다. 일반 사용자는 기본값을 사용하면됩니다.
houbysoft

28
@houbysoft : Python 3 사용자에게는 사실이지만 Python 2에서는 기본 프로토콜 (0)을 사용하는 것이 시간과 공간에서 엄청나게 비효율적 일뿐만 아니라 프로토콜 2+가 잘 처리하는 많은 것들을 실제로 처리 할 수는 없습니다 (예 : 새로운 것) 를 사용하는 스타일 클래스 __slots__). 나는 항상을 사용해야한다고 말하지 HIGHEST_PROTOCOL는 않지만 프로토콜 0 또는 1을 사용하지 않는 것이 실제로 중요합니다.
ShadowRanger

11
pickle.HIGHEST_PROTOCOL실제로 무엇을 합니까?
BallpointBen

7
@BallpointBen : Python 버전에서 지원하는 최고 프로토콜 버전을 선택합니다. docs.python.org/3/library/pickle.html#data-stream-format
Blender

92
import pickle

your_data = {'foo': 'bar'}

# Store data (serialize)
with open('filename.pickle', 'wb') as handle:
    pickle.dump(your_data, handle, protocol=pickle.HIGHEST_PROTOCOL)

# Load data (deserialize)
with open('filename.pickle', 'rb') as handle:
    unserialized_data = pickle.load(handle)

print(your_data == unserialized_data)

HIGHEST_PROTOCOL파일이 작아진다는 장점 이 있습니다. 이렇게하면 산 세척이 훨씬 빨라집니다.

중요 사항 : 피클의 최대 파일 크기는 약 2GB입니다.

대체 방법

import mpu
your_data = {'foo': 'bar'}
mpu.io.write('filename.pickle', data)
unserialized_data = mpu.io.read('filename.pickle')

대체 형식

응용 프로그램의 경우 다음이 중요 할 수 있습니다.

  • 다른 프로그래밍 언어로 지원
  • 읽기 / 쓰기 성능
  • 소형화 (파일 크기)

참조 : 데이터 직렬화 형식 비교

구성 파일을 만드는 방법을 찾고 있다면 짧은 기사 구성 파일을 파이썬 으로 읽으십시오.


1
2GB 제한은 protocol = 4 이상으로 제거되었다고 생각합니다.
ComputerScientist

28
# Save a dictionary into a pickle file.
import pickle

favorite_color = {"lion": "yellow", "kitty": "red"}  # create a dictionary
pickle.dump(favorite_color, open("save.p", "wb"))  # save it into a file named save.p

# -------------------------------------------------------------
# Load the dictionary back from the pickle file.
import pickle

favorite_color = pickle.load(open("save.p", "rb"))
# favorite_color is now {"lion": "yellow", "kitty": "red"}

1
open () 다음에 close ()를 사용해야합니까?
PlsWork

1
그렇습니다. 그러나 CPython (아마도 가지고있는 기본 파이썬)에서는 파일 객체가 만료 될 때마다 (아무것도 참조하지 않는 경우) 파일이 자동으로 닫힙니다. 이 경우 open ()에 의해 리턴 된 후 파일 오브젝트를 참조하는 것이 없으므로로드가 리턴 되 자마자 닫힙니다. 이것은 좋은 습관으로 간주되지 않으며 다른 시스템에서 문제를 일으킬 것입니다
Ankur S

14

일반적으로 dict문자열과 정수와 같이 단순한 객체가 없으면 a 를 피클 링하는 데 실패합니다.

Python 2.7.9 (default, Dec 11 2014, 01:21:43) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from numpy import *
>>> type(globals())     
<type 'dict'>
>>> import pickle
>>> pik = pickle.dumps(globals())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1374, in dumps
    Pickler(file, protocol).dump(obj)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 224, in dump
    self.save(obj)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 663, in _batch_setitems
    save(v)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 306, in save
    rv = reduce(self.proto)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy_reg.py", line 70, in _reduce_ex
    raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle module objects
>>> 

정말 간단한 dict것 조차 종종 실패합니다. 그것은 단지 내용에 달려 있습니다.

>>> d = {'x': lambda x:x}
>>> pik = pickle.dumps(d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1374, in dumps
    Pickler(file, protocol).dump(obj)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 224, in dump
    self.save(obj)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 663, in _batch_setitems
    save(v)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 748, in save_global
    (obj, module, name))
pickle.PicklingError: Can't pickle <function <lambda> at 0x102178668>: it's not found as __main__.<lambda>

그러나 dillor 와 같은 더 나은 serializer를 사용하면 cloudpickle대부분의 사전을 선택할 수 있습니다.

>>> import dill
>>> pik = dill.dumps(d)

또는 dict파일에 파일 을 저장하려면 ...

>>> with open('save.pik', 'w') as f:
...   dill.dump(globals(), f)
... 

후자의 예는 여기에 게시 된 다른 좋은 답변과 동일합니다 (이 내용의 선택 가능성을 무시하는 것 제외 dict).


9
>>> import pickle
>>> with open("/tmp/picklefile", "wb") as f:
...     pickle.dump({}, f)
... 

일반적으로 cPickle 구현을 사용하는 것이 좋습니다

>>> import cPickle as pickle
>>> help(pickle.dump)
Help on built-in function dump in module cPickle:

dump(...)
    dump(obj, file, protocol=0) -- Write an object in pickle format to the given file.

    See the Pickler docstring for the meaning of optional argument proto.

6

dict을 단일 파일에 저장하려면 다음 pickle과 같이 사용하십시오

import pickle

a = {'hello': 'world'}

with open('filename.pickle', 'wb') as handle:
    pickle.dump(a, handle)

with open('filename.pickle', 'rb') as handle:
    b = pickle.load(handle)

보다 복잡한 데이터를 캐싱하고 저장하기 위해 여러 사전에 여러 사전을 저장 및 복원하려면 anycache를 사용 하십시오 . 그것은 당신이 필요로하는 다른 모든 것들을 수행합니다.pickle

from anycache import anycache

@anycache(cachedir='path/to/files')
def myfunc(hello):
    return {'hello', hello}

Anycache는 myfunc다른 파일에 대한 인수에 따라 다른 결과를 저장 cachedir하고 다시로드합니다.

자세한 내용은 설명서 를 참조 하십시오.


6

Python 데이터 (예 : 사전)를 피클 파일로 덤프하는 간단한 방법입니다.

import pickle

your_dictionary = {}

pickle.dump(your_dictionary, open('pickle_file_name.p', 'wb'))

3
import pickle

dictobj = {'Jack' : 123, 'John' : 456}

filename = "/foldername/filestore"

fileobj = open(filename, 'wb')

pickle.dump(dictobj, fileobj)

fileobj.close()

-8

피클 링이 혼란 스러웠습니다 (아마도 두껍기 때문에). 그래도 이것이 작동한다는 것을 알았습니다.

myDictionaryString=str(myDictionary)

그런 다음 텍스트 파일에 쓸 수 있습니다. 정수를 .dat 파일에 쓰라는 오류가 발생하면서 pickle을 사용하려고 포기했습니다. 피클을 사용하지 않아서 죄송합니다.


1
-1 : 나중에 다시 실행하기 위해 기다리지 않고 나중에 읽을 수 있도록 그대로 (예 : 파이썬 객체) 저장해야합니다. Pickle을 사용하면 나중에 읽을 파이썬 객체를 저장할 수 있습니다.
Catbuilts

이것은 저품질 게시물 대기열에 다시 나오는 오래된 답변입니다. 매우 간단한 사전에서는 작동 할 수 있다는 나쁜 해결책은 아니지만 dict더 깊이있는 객체를 포함 하는 것은 매우 합리적입니다. name) 및 / 또는 완전한 문자열 표현이없는 객체.
ti7

1
@ ti7의 요점에 추가하기 위해 답변의 기술적 장점에 관계 없이이 게시물은 VLQ가 아닙니다. 이 답변이 정확하지 않다고 생각되는 사람은 VLQ로 표시 하지 말고 이유를 설명하거나 의견 을 말해야합니다.
EJoshuaS-
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.