2009-06-26 10 views
23

मान लीजिए मैं कुछ इस तरह है:पायथन में फ़ाइल में डेटा संरचना को बनाए रखने का सबसे आसान तरीका?

d = { "abc" : [1, 2, 3], "qwerty" : [4,5,6] } 

क्या लिए सबसे आसान तरीका progammatically है कि एक फ़ाइल है कि मैं अजगर से बाद में लोड कर सकते हैं में हो रहा है?

क्या मैं इसे किसी भी तरह से पाइथन स्रोत के रूप में सहेज सकता हूं (एक पायथन लिपि के भीतर से, मैन्युअल रूप से नहीं!), फिर import बाद में?

या मुझे JSON या कुछ का उपयोग करना चाहिए?

+0

यहां कुछ और है: [डेटासेट] (https://dataset.readthedocs.org/en/latest/) और [jsonpickle] (http://jsonpickle.github.io)। – zekel

उत्तर

48

pickle मॉड्यूल का उपयोग करें।

import pickle 
d = { "abc" : [1, 2, 3], "qwerty" : [4,5,6] } 
afile = open(r'C:\d.pkl', 'wb') 
pickle.dump(d, afile) 
afile.close() 

#reload object from file 
file2 = open(r'C:\d.pkl', 'rb') 
new_d = pickle.load(file2) 
file2.close() 

#print dictionary object loaded from file 
print new_d 
+0

पथ के सामने आर क्या है? – Blorgbeard

+0

इसके अलावा, यह मुझे "TypeError: टेक्स्ट स्ट्रीम में बाइट्स नहीं लिख सकता" - क्या यह Python 3.0 के लिए कोई अलग है? – Blorgbeard

+2

आर '' यहां वर्णित कच्ची स्ट्रिंग को दर्शाता है: http://docs.python.org/reference/lexical_analysis.html#string-literals। असल में, इसका मतलब है कि स्ट्रिंग में बैकस्लाश को शाब्दिक बैकस्लाश के रूप में शामिल किया गया है, चरित्र नहीं बचता है (हालांकि कच्ची स्ट्रिंग बैकस्लैश में समाप्त नहीं हो सकती है)। – Miles

3

यदि आप JSON- जैसे प्रारूप को पढ़ने में आसानी से सहेजना चाहते हैं, तो ऑब्जेक्ट को क्रमबद्ध करने के लिए repr का उपयोग करें और eval इसे deserialize करने के लिए।

repr(object) -> string

Return the canonical string representation of the object. For most object types, eval(repr(object)) == object .

+1

ast.literal_eval() (http://docs.python.org/library/ast.html#ast पर विचार करें।literal_eval) eval() के विकल्प के रूप में। – Miles

+0

मुख्य समाधान जो मुझे इस समाधान के बारे में पसंद नहीं है वह यह है कि आपके पास संरचना में एक वस्तु है जहां eval (repr()) पहचान नहीं है, repr() "सफल" होगा लेकिन फिर eval() barf होगा। – Miles

+0

@ जॉन आप उस उत्तर के लिए पायलट किया जाएगा ... एसएलॉट थे? – mhawke

11

अपना चयन लें: Python Standard Library - Data Persistance। कौन सा सबसे उपयुक्त है आपकी विशिष्ट आवश्यकताओं के अनुसार भिन्न हो सकता है।

pickle शायद सबसे सरल और सबसे सक्षम है, जहां तक ​​"फ़ाइल में एक मनमानी वस्तु लिखना और इसे पुनर्प्राप्त करना" जाता है-यह स्वचालित रूप से कस्टम कक्षाओं और परिपत्र संदर्भों को संभाल सकता है।

सर्वोत्तम पिकलिंग प्रदर्शन (गति और स्थान) के लिए, HIGHEST_PROTOCOL पर उपयोग करें।

5

टांड़ मॉड्यूल जो आप लगातार शब्दकोश दे देंगे, उदाहरण के लिए प्रयास करें:

import shelve 
d = { "abc" : [1, 2, 3], "qwerty" : [4,5,6] } 

shelf = shelve.open('shelf_file') 
for key,val in d.items(): 
    shelf[key] = val 

shelf.close() 

.... 

# reopen the shelf 
shelf = shelve.open('shelf_file') 
print shelf # => {'qwerty': [4, 5, 6], 'abc': [1, 2, 3]} 
2

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

2

JSON दोष है, लेकिन जब यह अपनी आवश्यकताओं को पूरा है, यह भी है:

  • सरल उपयोग करने के लिए
  • json module
  • इंटरफेस के रूप में मानक पुस्तकालय कुछ हद तक pickle के समान है, जो कर सकते हैं में शामिल अधिक जटिल स्थितियों को संभालें
  • डीबगिंग, साझाकरण और संस्करण नियंत्रण के लिए मानव-संपादन योग्य पाठ
  • मान्य पायथन कोड
  • वेब पर अच्छी तरह से स्थापित (अपने कार्यक्रम कि डोमेन के किसी भी छू लेती है, तो)
+4

JSON मान्य पायथन नहीं है। ऐसा लगता है, सतही रूप से, लेकिन कुछ बूल का उपयोग करें और आपको समस्या दिखाई देगी (JSON सत्य और गलत का उपयोग करता है, जबकि पायथन सही और गलत का उपयोग करता है)। इसके अलावा: JSON arrays (dicts) में केवल स्ट्रिंग कुंजी हैं। इसलिए यह डेटा संरचना को सही ढंग से संरक्षित नहीं करता है। –

3

तुम भी Zope's Object Database पर एक नज़र और अधिक जटिल आप :-) शायद तुम्हारे पास क्या है के लिए overkill मिल लेने के लिए चाहते हो सकता है, लेकिन यह अच्छी तरह से स्केल करता है और उपयोग करने में बहुत मुश्किल नहीं है।

संबंधित मुद्दे