2012-11-08 14 views
6

मैं जो DB में कुछ रिकॉर्ड बनाता है एक YAML सेटिंग फ़ाइल का नियंत्रण आदेश:PyYAML:() yaml.load से बुलाया आइटम

setting1: 
    name: [item,item] 
    name1: text 
anothersetting2: 
    name: [item,item] 
    sub_setting: 
     name :[item,item] 

जब मैं setting3 के साथ इस फ़ाइल को अद्यतन करने और DB में रिकॉर्ड को पुनर्जीवित द्वारा:

import yaml 
fh = open('setting.txt', 'r') 
setting_list = yaml.load(fh) 
for i in setting_list: 
    add_to_db[i] 

यह महत्वपूर्ण है कि सेटिंग्स (DB में आईडी नंबर) उनमें से आदेश im के रूप में ही हर बार रहना उन्हें डाटाबेस को addig ... और setting3 सिर्फ yaml.load के साथ जोड़ दिया जाता है() अंत है ताकि उसकी आईडी किसी भी रिकॉर्ड को भ्रमित न करे जो पहले से ही मैं हूं n डीबी ... इस समय मैं एक और सेटिंग जोड़ता हूं और yaml.load() रिकॉर्ड को अलग-अलग क्रम में लोड किया जाता है जिसके परिणामस्वरूप अलग-अलग आईडी होते हैं। मैं किसी भी विचारों का स्वागत करते हैं;)

संपादित करें: मैं सुझावों abarnert पीछा किया और इस सार https://gist.github.com/844388

ले लिया गया है वर्क्स की उम्मीद धन्यवाद के रूप में!

+0

पहला, है यह 'पाययाम', या कुछ और? कोई अंतर्निर्मित 'yaml' मॉड्यूल नहीं है, और कम से कम दो पीईपीआई पैकेज जो आपको' yaml' मॉड्यूल देते हैं। आम तौर पर, जब भी आप किसी तृतीय-पक्ष मॉड्यूल का उपयोग कर रहे हों, तो आपको यह कहना चाहिए कि आपको यह कहां से मिला है। – abarnert

+0

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

+0

मैं इस सवाल के शीर्षक के रूप में PyYAML का उपयोग कर सुझाव दूंगा ... -> PyYAML: yaml.load() द्वारा बुलाए गए आइटमों को नियंत्रित करने का नियंत्रण। आपके सुझाव के लिए धन्यवाद!! – zzart

उत्तर

4

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

बेशक वाईएएमएल एक्स्टेंसिबल है, और आपको "ऑर्डर मैपिंग" प्रकार को अपनी सेटिंग्स फ़ाइलों में जोड़ने से रोक नहीं रहा है। उदाहरण के लिए:

!omap setting1: 
    name: [item,item] 
    name1: text 
!omap anothersetting2: 
    name: [item,item] 
    !omap sub_setting: 
     name :[item,item] 

आप जो yaml मॉड्यूल का उपयोग कर रहे उल्लेख नहीं था। मानक पुस्तकालय में ऐसा कोई मॉड्यूल नहीं है, और केवल पीपीपीआई पर कम से कम दो पैकेज हैं जो उस नाम के साथ मॉड्यूल प्रदान करते हैं। हालांकि, मैं अनुमान लगा रहा हूं कि यह PyYAML है, क्योंकि जहां तक ​​मुझे पता है कि यह सबसे लोकप्रिय है।

ऊपर वर्णित विस्तार PyYAML के साथ पार्स करना आसान है। बजाय

def omap_constructor(loader, node): 
    return loader.construct_pairs(node) 
yaml.add_constructor(u'!omap', omap_constructor) 

अब,: http://pyyaml.org/ticket/29 देखें

{'anothersetting2': {'name': ['item', 'item'], 
    'sub_setting': 'name :[item,item]'}, 
'setting1': {'name': ['item', 'item'], 'name1': 'text'}} 

आप इस मिल जाएगा:

(('anothersetting2', (('name', ['item', 'item']), 
    ('sub_setting', ('name, [item,item]'),))), 
('setting1', (('name', ['item', 'item']), ('name1', 'text')))) 

बेशक यह आप की-वैल्यू tuple रों की एक tuple देता है, लेकिन आप आसानी से build_ordereddict लिख सकते हैं और इसके बजाय OrderedDict प्राप्त कर सकते हैं। यदि आप आउटपुट के साथ-साथ इनपुट की आवश्यकता है, तो आप OrdereredDict ऑब्जेक्ट्स !omap एस के रूप में एक प्रतिनिधि भी लिख सकते हैं।

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

0

आखिरकार मैंने सुना, पीईवाईएएमएल ने इसका समर्थन नहीं किया, हालांकि संभवतः एक शब्दकोश या शब्दकोश-जैसी वस्तु को प्रारंभिक बिंदु के रूप में स्वीकार करने के लिए इसे संशोधित करना आसान होगा।

+0

यह वास्तव में काम नहीं करेगा। सबसे पहले, वाईएएमएल दस्तावेज़ों को शब्दकोश नहीं होना चाहिए। दूसरा, यदि आप कहते हैं, 'ऑर्डर्ड डिक्ट' कहें, तो सभी उप-शब्दकोश अभी भी 'dict' होंगे। तो आपको वास्तव में क्या चाहिए 'इसे 'dict' के स्थान पर उपयोग करने के लिए एक अलग कन्स्ट्रक्टर को स्वीकार करने के लिए संशोधित करना है (और, आदर्श रूप से, प्रत्येक कन्स्ट्रक्टर के लिए इसका उपयोग करता है, हालांकि अन्य अक्सर उपयोगी नहीं होंगे)। – abarnert

3

अब आप ruaml.yaml का उपयोग कर सकते हैं।

https://pypi.python.org/pypi/ruamel.yaml से:

ruamel.yaml एक YAML पार्सर/emitter टिप्पणी, seq/नक्शा प्रवाह शैली के गोल यात्रा संरक्षण का समर्थन करता है कि, और कुंजी आदेश

0

नक्शा एक भी दिए गए के लिए है ऑब्जेक्ट जिसे एक ऑर्डर किया गया शब्दकोश माना जाता है, केवल एक सूची के आइटम और इस्तेमाल किए गए संग्रह को बनाते हैं। ऑर्डर्ड डिक्ट:

setting1: 
    - name: [item,item] 
    - name1: text 
anothersetting2: 
    - name: [item,item] 
    - sub_setting: 
     name :[item,item] 

import collections 
import yaml 
fh = open('setting.txt', 'r') 
setting_list = yaml.load(fh) 

setting1 = collections.OrderedDict(list(x.items())[0] for x in setting_list['setting1']) 
संबंधित मुद्दे