खोज…


परिचय

शेल्व एक अजगर मॉड्यूल है जिसका उपयोग किसी फाइल में वस्तुओं को स्टोर करने के लिए किया जाता है। शेल्व मॉड्यूल एक अनियंत्रित पाइथन वस्तुओं के लिए लगातार भंडारण को लागू करता है, जिसे शब्दकोश जैसे एपीआई का उपयोग करके उठाया जा सकता है। शेल्व मॉड्यूल का उपयोग पायथन ऑब्जेक्ट्स के लिए एक साधारण सतत भंडारण विकल्प के रूप में किया जा सकता है जब एक रिलेशनल डेटाबेस ओवरकिल होता है। शेल्फ को चाबियों द्वारा एक्सेस किया जाता है, जैसे एक शब्दकोश के साथ। मानों को चुना जाता है और किसी भी डेटाबेस द्वारा निर्मित और प्रबंधित डेटाबेस के लिए लिखा जाता है।

टिप्पणियों

नोट: स्वचालित रूप से बंद किए जा रहे शेल्फ पर भरोसा न करें; हमेशा close() स्पष्ट रूप से कॉल करें जब आपको इसकी आवश्यकता नहीं है, या संदर्भ प्रबंधक के रूप में shelve.open() उपयोग करें:

with shelve.open('spam') as db:
    db['eggs'] = 'eggs'

चेतावनी:

क्योंकि shelve मॉड्यूल pickle द्वारा समर्थित है, इसलिए यह अविश्वसनीय स्रोत से शेल्फ लोड करने के लिए असुरक्षित है। अचार की तरह, एक शेल्फ को लोड करना मनमाने कोड को निष्पादित कर सकता है।

प्रतिबंध

1 है । किस डेटाबेस पैकेज का उपयोग किया जाएगा (जैसे dbm.ndbm या dbm.gnu) इस बात पर निर्भर करता है कि कौन सा इंटरफ़ेस उपलब्ध है। इसलिए डेटाबेस को सीधे dbm का उपयोग करके खोलना सुरक्षित नहीं है। डेटाबेस भी (दुर्भाग्य से) dbm की सीमाओं के अधीन है, अगर इसका उपयोग किया जाता है - इसका मतलब है कि (डेटाबेस में संग्रहीत ऑब्जेक्ट्स का पिकड प्रतिनिधित्व) काफी छोटा होना चाहिए, और दुर्लभ मामलों में महत्वपूर्ण टकराव डेटाबेस का कारण बन सकता है अपडेट से इंकार करें।

2। आश्रय मॉड्यूल समवर्ती वस्तुओं के समवर्ती पढ़ने / लिखने के लिए समर्थन नहीं करता है। (एकाधिक एक साथ पढ़ने की पहुंच सुरक्षित है।) जब किसी कार्यक्रम में लिखने के लिए एक शेल्फ खुला होता है, तो किसी अन्य कार्यक्रम को पढ़ने या लिखने के लिए खुला नहीं होना चाहिए। यूनिक्स फ़ाइल लॉकिंग का उपयोग इसे हल करने के लिए किया जा सकता है, लेकिन यह यूनिक्स संस्करणों में भिन्न होता है और इसके लिए उपयोग किए जाने वाले डेटाबेस कार्यान्वयन के बारे में ज्ञान की आवश्यकता होती है।

आश्रय के लिए नमूना कोड

किसी ऑब्जेक्ट को प्राप्त करने के लिए, पहले मॉड्यूल को आयात करें और फिर ऑब्जेक्ट वैल्यू को निम्नानुसार असाइन करें:

import shelve 
 database = shelve.open(filename.suffix) 
 object = Object() 
 database['key'] = object 

इंटरफ़ेस को सारांशित करने के लिए (कुंजी एक स्ट्रिंग है, डेटा एक मनमाना वस्तु है):

import shelve

d = shelve.open(filename)  # open -- file may get suffix added by low-level
                           # library

d[key] = data              # store data at key (overwrites old data if
                           # using an existing key)
data = d[key]              # retrieve a COPY of data at key (raise KeyError
                           # if no such key)
del d[key]                 # delete data stored at key (raises KeyError
                           # if no such key)

flag = key in d            # true if the key exists
klist = list(d.keys())     # a list of all existing keys (slow!)

# as d was opened WITHOUT writeback=True, beware:
d['xx'] = [0, 1, 2]        # this works as expected, but...
d['xx'].append(3)          # *this doesn't!* -- d['xx'] is STILL [0, 1, 2]!

# having opened d without writeback=True, you need to code carefully:
temp = d['xx']             # extracts the copy
temp.append(5)             # mutates the copy
d['xx'] = temp             # stores the copy right back, to persist it

# or, d=shelve.open(filename,writeback=True) would let you just code
# d['xx'].append(5) and have it work as expected, BUT it would also
# consume more memory and make the d.close() operation slower.

d.close()                  # close it

एक नया शेल्फ बनाना

शेल्व का उपयोग करने का सबसे सरल तरीका DbfilenameShelf वर्ग है। यह डेटा को स्टोर करने के लिए anydbm का उपयोग करता है। आप सीधे कक्षा का उपयोग कर सकते हैं, या केवल शेल्व.ओपन कह सकते हैं () :

import shelve

s = shelve.open('test_shelf.db')
try:
    s['key1'] = { 'int': 10, 'float':9.5, 'string':'Sample data' }
finally:
    s.close()

डेटा को फिर से एक्सेस करने के लिए, शेल्फ खोलें और इसे एक शब्दकोश की तरह उपयोग करें:

    import shelve
    
    s = shelve.open('test_shelf.db')
    try:
        existing = s['key1']
    finally:
        s.close()

print existing

यदि आप दोनों नमूना स्क्रिप्ट चलाते हैं, तो आपको देखना चाहिए:

$ python shelve_create.py
$ python shelve_existing.py

{'int': 10, 'float': 9.5, 'string': 'Sample data'}

Dbm मॉड्यूल एक ही समय में एक ही डेटाबेस पर लिखने वाले कई एप्लिकेशन का समर्थन नहीं करता है। यदि आप जानते हैं कि आपका ग्राहक शेल्फ को संशोधित नहीं कर रहा है, तो आप डेटाबेस को केवल-पढ़ने के लिए शेल्व बता सकते हैं।

import shelve

s = shelve.open('test_shelf.db', flag='r')
try:
    existing = s['key1']
finally:
    s.close()

print existing

यदि आपका प्रोग्राम केवल पढ़ने के लिए डेटाबेस को संशोधित करने का प्रयास करता है, तो एक एक्सेस त्रुटि अपवाद उत्पन्न होता है। अपवाद प्रकार डेटाबेस डेटाबेस पर निर्भर करता है जब डेटाबेस बनाया गया था।

वापस लिखना

अलमारियाँ डिफ़ॉल्ट रूप से अस्थिर वस्तुओं में संशोधन को ट्रैक नहीं करती हैं। इसका मतलब है कि यदि आप शेल्फ में संग्रहीत किसी आइटम की सामग्री को बदलते हैं, तो आपको आइटम को फिर से संग्रहीत करके स्पष्ट रूप से शेल्फ को अपडेट करना होगा।

import shelve

s = shelve.open('test_shelf.db')
try:
    print s['key1']
    s['key1']['new_value'] = 'this was not here before'
finally:
    s.close()

s = shelve.open('test_shelf.db', writeback=True)
try:
    print s['key1']
finally:
    s.close()

इस उदाहरण में, 'key1' का शब्दकोश फिर से संग्रहीत नहीं किया गया है, इसलिए जब शेल्फ को फिर से खोला गया है, तो परिवर्तन संरक्षित नहीं किए गए हैं।

$ python shelve_create.py
$ python shelve_withoutwriteback.py

{'int': 10, 'float': 9.5, 'string': 'Sample data'}
{'int': 10, 'float': 9.5, 'string': 'Sample data'}

स्वचालित रूप से शेल्फ में संग्रहीत अस्थिर वस्तुओं में परिवर्तन को पकड़ने के लिए, शेलबैक को राइटबैक सक्षम के साथ खोलें। राइटबैक ध्वज इन-मेमोरी कैश का उपयोग करके डेटाबेस से प्राप्त सभी वस्तुओं को याद करने के लिए शेल्फ का कारण बनता है। शेल्फ बंद होने पर प्रत्येक कैश ऑब्जेक्ट को डेटाबेस में वापस भी लिखा जाता है।

import shelve

s = shelve.open('test_shelf.db', writeback=True)
try:
    print s['key1']
    s['key1']['new_value'] = 'this was not here before'
    print s['key1']
finally:
    s.close()

s = shelve.open('test_shelf.db', writeback=True)
try:
    print s['key1']
finally:
    s.close()

यद्यपि यह प्रोग्रामर त्रुटि की संभावना को कम करता है, और ऑब्जेक्ट को अधिक पारदर्शी बना सकता है, राइटबैक मोड का उपयोग करना हर स्थिति में वांछनीय नहीं हो सकता है। कैश अतिरिक्त मेमोरी का उपभोग करता है, जबकि शेल्फ खुला है, और हर कैश्ड ऑब्जेक्ट को डेटाबेस में वापस लिखने के लिए रोक रहा है जब यह बंद हो जाता है तो अतिरिक्त समय लग सकता है। चूंकि यह बताने का कोई तरीका नहीं है कि क्या कैश्ड वस्तुओं को संशोधित किया गया है, इसलिए वे सभी वापस लिखे गए हैं। यदि आपका एप्लिकेशन इससे अधिक डेटा लिखता है, तो राइटबैक आपसे अधिक ओवरहेड जोड़ देगा।

$ python shelve_create.py
$ python shelve_writeback.py

{'int': 10, 'float': 9.5, 'string': 'Sample data'}
{'int': 10, 'new_value': 'this was not here before', 'float': 9.5, 'string': 'Sample data'}
{'int': 10, 'new_value': 'this was not here before', 'float': 9.5, 'string': 'Sample data'}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow