SORU
25 Aralık 2010, CUMARTESİ


Tasarruf bir Nesne (Python Veri sebat)

Böyle bir nesne oluşturduk:

company1.name = 'banana' 
company1.value = 40

Bu nesne kaydetmek istiyorum. Bunu nasıl yapabilirim?

CEVAP
25 Aralık 2010, CUMARTESİ


Standart kütüphanede pickle modülünü kullanabilirsiniz.
İşte örnek için basit bir uygulama:

import pickle

class Company(object):
    def __init__(self, name, value):
        self.name = name
        self.value = value

with open('company_data.pkl', 'wb') as output:
    company1 = Company('banana', 40)
    pickle.dump(company1, output, pickle.HIGHEST_PROTOCOL)

    company2 = Company('spam', 42)
    pickle.dump(company2, output, pickle.HIGHEST_PROTOCOL)

del company1
del company2

with open('company_data.pkl', 'rb') as input:
    company1 = pickle.load(input)
    print(company1.name)  # -> banana
    print(company1.value)  # -> 40

    company2 = pickle.load(input)
    print(company2.name) # -> spam
    print(company2.value)  # -> 42

Ayrıca bir dosya açar ve bunun için tek bir nesne yazar aşağıdaki gibi: basit bir programı kullanabilirsiniz

def save_object(obj, filename):
    with open(filename, 'wb') as output:
        pickle.dump(obj, output, pickle.HIGHEST_PROTOCOL)

# sample usage
save_object(company1, 'company1.pkl')

Güncelleme:

Bu gibi popüler bir cevap olduğundan, biraz gelişmiş birkaç kullanım konulara değinmek istiyorum.

İlk olarak, hemen hemen her zaman tercih edilen eski C ile yazılmış ve çok daha hızlı olduğu için aslında pickle yerine cPickle modülünü kullanın. Aralarında bazı ince farklılıklar vardır, ama çoğu durumda onlar eşdeğer ve C sürümü çok üstün performans sağlayacaktır. Bu geçiş daha kolay, sadece bu import deyimini değiştirmek olamazdı:

import cPickle as pickle

(Not: Python 3, cPickle değiştirildi ** 16 yaşında, ama artık buna gerek çünkü pickle modül şimdi otomatik olarak-bakın soru What difference between pickle and _pickle in python 3?).

İkincisi, her Ara pickle.HIGHEST_PROTOCOL yazmak yerine (istediğin budur, ve hep öyle varsayarsak), sadece edebi -1kullanabilirsiniz. Yani, yazmak yerine:

pickle.dump(obj, output, pickle.HIGHEST_PROTOCOL)

Sadece yazabilirsiniz:

pickle.dump(obj, output, -1)

Biraz daha kısa, oldukça.

Sadece protokol belirtmek zorunda bile daha iyi bir şekilde bir kez Pickler bir nesne oluşturun ve birden çok turşu işlemleri yapın:

pickler = pickle.Pickler(output, -1)
pickler.dump(obj1)
pickler.dump(obj2)
   etc...

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Police

    Android Poli

    21 NİSAN 2010
  • The Slow Mo Guys

    The Slow Mo

    15 AĞUSTOS 2010
  • theKGB65

    theKGB65

    24 Aralık 2007