Ceviz Forum

Geri Dön   Ceviz Forum > Programlama > Python / Zope

Cevapla
 
LinkBack Seçenekler
Eski 05/09/2007, 22:45   #1 (permalink)
osx
Üye
 
Üyelik Tarihi: 02/2007
Mesaj: 31
Varsayılan Veri kopyalama sorunu (shelve,copy kütüphaneleri)

Selam arkadaşlar...
shelve kullanarak basit bir veri tabanı sistemi geliştirmeye çalışıyorum ve projede şöyle bir sorunla karşılaştım; shelve ile hazırladığım veritabanını okutuyorum ve okuttuğum verileri "copy" kütüphanesi sayesinde kopyalamaya çalışıyorum fakat olmuyor...

örnek:
Kod:
>>> import shelve,copy
>>> db=shelve.open("deneme.db")
>>> db["Adana"]=["seyhan","yüreğir","karataş"]
>>> vt=copy.copy(db)
>>> db.close()
>>> vt

 Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    vt
  File "C:\Python25\lib\UserDict.py", line 167, in __repr__
    return repr(dict(self.iteritems()))
  File "C:\Python25\lib\UserDict.py", line 105, in iteritems
    for k in self:
  File "C:\Python25\lib\UserDict.py", line 92, in __iter__
    for k in self.keys():
  File "C:\Python25\lib\shelve.py", line 92, in keys
    return self.dict.keys()
  File "C:\Python25\lib\bsddb\__init__.py", line 251, in keys
    self._checkOpen()
  File "C:\Python25\lib\bsddb\__init__.py", line 212, in _checkOpen
    raise error, "BSDDB object has already been closed"
DBError: BSDDB object has already been closed
>>>
bildiğiniz gibi en güvenli yol açılan dosyanın otomatik olarak kapatılmasını beklemeden sistemli bir şekilde kapatmak, yukarıdaki hataya nasıl bir çözüm bulabilirim?..
Teşekkürler...
osx hatta değil   Alıntı Yaparak Yanıtla
Eski 05/09/2007, 23:38   #2 (permalink)
Eski Cevizci
 
myavuzselim Adlı Üyenin Profil Grafiği
 
Üyelik Tarihi: 05/2004
Mesaj: 792
Varsayılan

Soyle birsey yazdim, belki isine yarayabilir:
Kod:
# not: yaratilan bir Kapatici nesnesine baska bir referans
# olmasin! Gerektiginde kopyasini alin. Mesela:
#
#  x = Kapatici(kapanan)
#
#  y = x             # hatali!
#  y = x.kopyala()   # dogru
#
#  func(x)           # hatali!
#  func(x.kopyala()) # dogru
#
#  arr = [x, x]                      # hatali!
#  arr = [x.kopyala(), x.kopyala()]  # dogru

class Kapatici:
    def __init__(self, kapanan, kopya_sayisi=None):
        self.kapanan = kapanan
        if kopya_sayisi != None:
            self.kopya_sayisi = kopya_sayisi
        else:
            self.kopya_sayisi = [1]

    def kopyala(self):
        kopya = Kapatici(self.kapanan, self.kopya_sayisi)
        self.kopya_sayisi[0] += 1
        return kopya

    def __del__(self):
        self.kopya_sayisi[0] -= 1
        if self.kopya_sayisi[0] == 0:
            self.kapanan.close()


# deneme
class DB:
    def __init__(self, isim):
        self.isim = isim
        print "%s: init" % self.isim
    def close(self):
        print "%s: kapandi" % self.isim
    def birsey_yap(self):
        print "%s: birsey_yap" % self.isim

def f(db_kapatici, bir_daha=False):
    db_kapatici.kapanan.birsey_yap()
    if bir_daha:
        f(db_kapatici)

def dene():
    x = Kapatici(DB("DB_1"))
    y = Kapatici(DB("DB_2"))

    xx = x.kopyala()
    f(xx)
    del x
    # del xx

    f(y, True)
myavuzselim hatta değil   Alıntı Yaparak Yanıtla
Eski 05/09/2007, 23:59   #3 (permalink)
osx
Üye
 
Üyelik Tarihi: 02/2007
Mesaj: 31
Varsayılan

teşekkürler...
osx hatta değil   Alıntı Yaparak Yanıtla
Eski 06/09/2007, 00:49   #4 (permalink)
Eski Cevizci
 
myavuzselim Adlı Üyenin Profil Grafiği
 
Üyelik Tarihi: 05/2004
Mesaj: 792
Varsayılan

Merhaba,

Yukarida hizlica aklima gelen birseyi yazmistim, ama sag kulagini sol elinle gosterir gibi olmus. Lutfen yukaridakini yazmadigimi farzedin

Soyle birsey olabilir:
Kod:
class Kapatici:
    def __init__(self, kapanan):
        self.kapanan = kapanan

    def __del__(self):
        self.kapanan.close()


# deneme
class DB:
    def __init__(self, isim):
        self.isim = isim
        print "%s: init" % self.isim
    def close(self):
        print "%s: kapandi" % self.isim
    def birsey_yap(self):
        print "%s: birsey_yap" % self.isim

def f(db_kapatici, bir_daha=False):
    db_kapatici.kapanan.birsey_yap()
    if bir_daha:
        f(db_kapatici)

def dene():
    x = Kapatici(DB("DB_1"))
    y = Kapatici(DB("DB_2"))

    xx = x
    f(xx)
    del x
    # del xx

    f(y, True)
myavuzselim hatta değil   Alıntı Yaparak Yanıtla
Eski 06/09/2007, 02:05   #5 (permalink)
Eski Cevizci
 
myavuzselim Adlı Üyenin Profil Grafiği
 
Üyelik Tarihi: 05/2004
Mesaj: 792
Varsayılan

Alıntı:
http://docs.python.org/lib/node328.html, mesajından alıntı:
Depending on the implementation, closing a persistent dictionary may or may not be necessary to flush changes to disk. The __del__ method of the Shelf class calls the close method, so the programmer generally need not do this explicitly.
Yani bu demek oluyor ki Shelf sinifi zaten dogru seyi yapiyor, yukaridaki Kapatici sinifini kullanmana veya close metodunu ozellikle cagirmana gerek yok.
myavuzselim hatta değil   Alıntı Yaparak Yanıtla
Eski 07/04/2008, 22:56   #6 (permalink)
osx
Üye
 
Üyelik Tarihi: 02/2007
Mesaj: 31
Varsayılan

Kod:
def veritabani_kopyala(veri):
    vt=[]
    anahtar=veri.keys()
    for x in anahtar:
        vt.insert(0,[x,veri[x]])
    return dict(vt)
baya zaman olmuş göndereli, konuyu okuduğumda ne kadar ilerlediğimi farkettim ...
osx hatta değil   Alıntı Yaparak Yanıtla
Eski 09/04/2008, 01:52   #7 (permalink)
Üye
 
Üyelik Tarihi: 05/2004
Yer: İzmir
Mesaj: 28
Varsayılan Shelve hatası

Merhaba,

shelve ile açtığınız dosyayı read-only modda açarsanız kapatmanıza gerek kalmaz.

db = shelve.open("ornek.db","r")
Onderce hatta değil   Alıntı Yaparak Yanıtla
Cevapla

Bookmarks

Seçenekler

Mesaj Yazma Hakları
Yeni mesajgöndermezsiniz
Cevap yazamazsınız
Dosya ekleyemezsiniz
Mesajınızı düzenleyemezsiniz

BB code is Açık
[IMG] kodu Açık
HTML kodu Kapalı
Trackbacks are Açık
Pingbacks are Açık
Refbacks are Açık

Benzer Konular
Konu Konuyu açana göre Forum Cevap En Son Mesaj
Javascript Kütüphaneleri Hakkında mTuran Javascript / DHTML / Ajax 9 20/06/2007 19:33
dev c++ kütüphaneleri ferdi04 C / C++ 2 27/05/2007 18:31
Copy & Paste = Hello! <sorunu!!!> vlknkzr Windows 4 29/04/2005 09:49
WinAPI ile Dosya Kopyalama Sorunu epic Pascal / Delphi / Delphi.NET 2 10/09/2004 19:13
C++ kütüphaneleri hakkında..? virU C / C++ 4 05/08/2004 17:29


Forum saati Türkiye saatine göredir. GMT +3. Şu anda saat 10:34.

Reklamlar & Desteklenenler
Hassas Valf | Hassas Kaplama | Antalyamız | Gazete | Ticari Bilişim | Hakan Müştak | Rüya Tabirleri | Kadın | Hastalıklar | Cepte msn ve e-posta | Webmaster | Antalya Aupair | Turkish Property Antalya | Forum | Chat | Perde | Adsl | Araba | bolindir.com | guncelle.com | livescore | Web Tasarım | evden eve nakliyat | forum | evden eve | sohbet | Resimcim| Kalifiye İnsan Kaynakları | Web Tasarım | Oyun | Yusuf KOÇ | Akın Yorulmaz | şiir | UFO | Web Tasarım | Oyunlar | Canlı Tv |


Forum Yazılımı: vBulletin Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0
Copyright ©2001 - 2008, Ceviz.net