Turşu kaydetmek için turşu nasıl kullanabilirim?


370

Python belgelerinin verdiği bilgilere baktım , ama hala biraz kafam karıştı. Birisi yeni bir dosya yazacak bir örnek kod gönderebilir ve ardından bir sözlük dökümü için turşu kullanabilir mi?


5
Bunu okuyun: doughellmann.com/PyMOTW/pickle ve belirli bir soruya ihtiyaç duyduğunuzda geri dönün
pyfunc

2
-1 Önceki yorumlara bakın. Dene. Daha sonra, işe yaramadıysa (her zaman olmaz), yönlendirilmiş bir soru formüle edilebilir (test edilebilen bir veya iki hipotezle birlikte ve muhtemelen soruyu diğer insanlara sormadan önce "sorgulanabilir"). Örneğin bir sözdizimi hatası var mıydı? Bir istisna? Değerler geri döndü mü?

1
Bunu pygame'den bilgi kaydetmek için kullanmaya çalışıyorum. Yukarıdaki bilgileri kullandım ve kodum şöyle görünüyor:
Chachmu

name = raw_input ('girdi dosya adı:') tf = açık (ad + '. pkl', 'wb') pickle.dump (toplam, tf) tf.close ()
Chachmu

2
Yüzey nesnelerini nasıl temizleyeceğiniz hakkında yeni bir soru sormalısınız
John La Rooy

Yanıtlar:


727

Bunu dene:

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: Neden kaldırdınız pickle.HIGHEST_PROTOCOL?
Blender

37
@Blender: bu soru seviyesi için ilgisiz ve gereksiz derecede karmaşık - ortalama kullanıcı varsayılanlarla iyi olacak.
houbysoft

28
@houbysoft: Python 3 kullanıcıları için doğrudur, ancak Python 2'de varsayılan protokolü (0) kullanmak sadece zaman ve mekanda inanılmaz derecede verimsiz olmakla kalmaz, aynı zamanda protokol 2 + 'nın iyi işlediği birçok şeyi işleyemez (örn. yeni tarzı sınıflar __slots__). Her zaman kullanmanız gerektiğini söylemiyorum HIGHEST_PROTOCOL, ancak protokol 0 veya 1'i kullanmamanızı sağlamak aslında oldukça önemlidir.
ShadowRanger

11
pickle.HIGHEST_PROTOCOLAslında ne yapar ?
BallpointBen

7
@BallpointBen: Python sürümünüzün desteklediği en yüksek protokol sürümünü seçer: 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)

Avantajı, HIGHEST_PROTOCOLdosyaların küçülmesidir. Bu, seçmeyi bazen çok daha hızlı hale getirir.

Önemli uyarı : Turşu için maksimum dosya boyutu yaklaşık 2 GB'dir.

Alternatif yol

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

Alternatif Biçimler

Başvurunuz için aşağıdakiler önemli olabilir:

  • Diğer programlama dillerinin desteği
  • Okuma / yazma performansı
  • Kompaktlık (dosya boyutu)

Ayrıca bakınız: Veri serileştirme formatlarının karşılaştırılması

Yapılandırma dosyaları oluşturmanın bir yolunu arıyorsanız , Python'daki yapılandırma dosyamdaki kısa makalemi okumak isteyebilirsiniz.


1
2GB sınırının protokol = 4 ve üstü ile kaldırıldığını düşünüyorum.
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 () öğesinden sonra close () kullanmak gerekli midir?
PlsWork

1
Evet, genel olarak. Ancak CPython'da (Muhtemelen sahip olduğunuz varsayılan python), dosya nesnesi her sona erdiğinde (hiçbir şey ifade etmediğinde) dosya otomatik olarak kapatılır. Bu durumda, open () tarafından döndürüldükten sonra hiçbir şey dosya nesnesini göstermediği için, yük geri döner dönmez kapatılacaktır. Bu iyi bir uygulama olarak kabul edilmez ve diğer sistemlerde sorunlara neden olur
Ankur S

14

Genel olarak, dictiçinde dizeler ve tamsayılar gibi yalnızca basit nesneler yoksa a seçimini yapmak başarısız olur.

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
>>> 

Gerçekten basit bir şey bile dictçoğu zaman başarısız olur. Sadece içeriğe bağlı.

>>> 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>

Ancak, dillveya gibi daha iyi bir serileştirici kullanırsanız cloudpickle, çoğu sözlük turşuya alınabilir:

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

Veya dictbir dosyaya kaydetmek istiyorsanız ...

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

İkinci örnek, burada yayınlanan diğer iyi cevapların herhangi biriyle aynıdır (bu, içeriğinin seçilebilirliğini ihmal etmekten başka dict).


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

normalde cPickle uygulamasını kullanmak tercih edilir

>>> 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

Eğer dikteyi tek bir dosyada saklamak istiyorsanız, pickleböyle kullanın

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)

Önbelleğe almak ve daha karmaşık verileri depolamak için birden çok dosyaya birden fazla sözlük kaydetmek ve geri yüklemek istiyorsanız, anycache kullanın . İhtiyacınız olan diğer tüm şeyleri yaparpickle

from anycache import anycache

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

Anycache farklı depolar myfunc , farklı dosyalardaki bağımsız değişkenlere bağlı olarak sonuçlarıcachedir ve yeniden yükler.

Daha fazla ayrıntı için belgelere bakın.


6

Python verilerini (örneğin sözlük) bir turşu dosyasına dökmenin basit yolu.

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

Turşu kafa karıştırıcı buldum (muhtemelen kalın olduğum için). Ama bunun işe yaradığını gördüm:

myDictionaryString=str(myDictionary)

Daha sonra bir metin dosyasına yazabilirsiniz. Bir .dat dosyasına tamsayı yazmamı söyleyen hatalar alırken turşu kullanmaya çalışırken vazgeçtim. Turşu kullanmadığım için özür dilerim.


1
-1: Olduğu gibi kaydetmelidir (yani bir python nesnesi), böylece daha sonra tekrar çalıştırmak için beklemeden saatlerce okuyabiliriz. Turşu, daha sonra okumak için bir python nesnesi depolamamıza izin verir.
Catbuilts

Bu, Düşük Kalite Yazıları kuyruğunda geri dönen eski bir cevaptır. Çok basit sözlükler için işe yaraması kötü bir çözüm değildir, ancak bir dictnesnenin daha fazla derinlik içermesi (sadece tarafından basılabilir) name) ve / veya tam dize gösterimi olmayan nesneler.
ti7

1
Cevabın teknik değerine bakılmaksızın @ ti7'nin noktasına eklemek için bu yazı VLQ değildir. Birisi bu cevabı hatalı olduğunu hisseder, onlar downvote olmalı ve / veya neden açıklama açıklayan değil VLQ olarak bayrak.
EJoshuaS - Monica
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.