파이썬 문서가 제공 하는 정보를 살펴 보았지만 여전히 약간 혼란 스럽습니다. 누군가 새 파일을 작성한 다음 pickle을 사용하여 사전을 덤프하는 샘플 코드를 게시 할 수 있습니까?
답변
이 시도:
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
답변
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')
대체 형식
- CSV : 매우 간단한 형식 ( 읽기 및 쓰기 )
- JSON : 사람이 읽을 수있는 데이터를 작성하는 데 적합합니다. 매우 일반적으로 사용됨 ( 읽기 및 쓰기 )
- YAML : YAML은 JSON의 상위 집합이지만 읽기 쉽습니다 ( 읽기 및 쓰기 , JSON 및 YAML 비교 )
- pickle : 파이썬 직렬화 형식 ( read & write )
- MessagePack ( Python 패키지 ) :보다 간결한 표현 ( 읽기 및 쓰기 )
- HDF5 ( Python 패키지 ) : 행렬에 적합 ( 읽기 및 쓰기 )
- XML : 존재합니다 * sigh * ( read & write )
응용 프로그램의 경우 다음이 중요 할 수 있습니다.
- 다른 프로그래밍 언어로 지원
- 읽기 / 쓰기 성능
- 소형화 (파일 크기)
참조 : 데이터 직렬화 형식 비교
구성 파일을 만드는 방법을 찾고 있다면 짧은 기사 구성 파일을 파이썬 으로 읽으십시오.
답변
# 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"}
답변
일반적으로 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>
그러나 dill
or 와 같은 더 나은 serializer를 사용하면 cloudpickle
대부분의 사전을 선택할 수 있습니다.
>>> import dill
>>> pik = dill.dumps(d)
또는 dict
파일에 파일 을 저장하려면 …
>>> with open('save.pik', 'w') as f:
... dill.dump(globals(), f)
...
후자의 예는 여기에 게시 된 다른 좋은 답변과 동일합니다 (이 내용의 선택 가능성을 무시하는 것 제외 dict
).
답변
>>> 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.
답변
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
하고 다시로드합니다.
자세한 내용은 설명서 를 참조 하십시오.
답변
Python 데이터 (예 : 사전)를 피클 파일로 덤프하는 간단한 방법입니다.
import pickle
your_dictionary = {}
pickle.dump(your_dictionary, open('pickle_file_name.p', 'wb'))