2013-02-13 30 views
10

मैंने कुछ डेटा बदलने के लिए अभी PyYAML का उपयोग करना शुरू कर दिया है।PyYAML मान रूपांतरण अक्षम करें

मैं सिर्फ yaml.load फ़ंक्शन का उपयोग करता हूं और यह तब तक मेरे लिए काफी अच्छा था जब तक कि मैंने देखा कि यह सभी मानों को यूनी-कोडित स्ट्रिंग, int, तिथियों आदि में परिवर्तित करने का प्रयास करता है।

यह मेरे आवेदन में घातक हो सकता है, क्या इस रूपांतरण से बचने का कोई तरीका है? मैं सबकुछ स्ट्रिंग के रूप में प्राप्त करना चाहता हूं। मैंने रचनाकारों को देखा और इस रूपांतरण को अक्षम करने का कोई तरीका नहीं मिला।

अद्यतन: मुझे yaml.load से क्या मिलता है OrderedDict है और सबकुछ अच्छा दिखता है। एकमात्र समस्या यह है कि कुछ मूल्य स्ट्रिंग हैं, और कुछ int हैं। मैं सभी मूल्यों को तारों के रूप में रखना चाहता हूं। मैं pyyaml ​​मेरे लिए मूल्यों को बदलने के लिए नहीं चाहता।

+0

तो फिर तुम YAML डिकोडिंग नहीं कर रहे हैं। इसके अलावा, ** आप वास्तव में क्या स्ट्रिंग के रूप में छोड़ना चाहते हैं और क्या नहीं? यदि आप * सब कुछ * एक स्ट्रिंग छोड़ते हैं, तो आप 'the_file.read() ';-) – delnan

+0

फ़ाइल को पार्सल का उपयोग कर पार्सल का उपयोग कर रहा हूं वास्तव में यम नहीं है लेकिन यह काफी करीब है। इसलिए मैं टाइप-रूपांतरण से बचना चाहता हूं। – theAlse

+0

लेकिन * क्या * प्रकार का प्रकार रूपांतरण? क्या आप सूचियां प्राप्त करना चाहते हैं? शब्दकोश? क्या आप बुलियन को परिवर्तित करना चाहते हैं? तैरता? मनमानी गहराई या एक निश्चित प्रारूप के साथ? जैसा कि यह खड़ा है, यह भी नीचे निर्दिष्ट है। – delnan

उत्तर

22

ठीक है, यदि आप एक स्ट्रिंग के रूप में सब कुछ छोड़ने के लिए Loader=yaml.BaseLoader इस्तेमाल कर सकते हैं:

>>> x = [[1,2,3], {1:2}] 
>>> s = yaml.dump(x) 
>>> s 
'- [1, 2, 3]\n- {1: 2}\n' 
>>> yaml.load(s) 
[[1, 2, 3], {1: 2}] 
>>> yaml.load(s, Loader=yaml.BaseLoader) 
[[u'1', u'2', u'3'], {u'1': u'2'}] 
+1

सावधान रहें: जबकि यह स्वचालित मान रूपांतरण अक्षम करता है, यह भी "<<" मर्ज कुंजी का कारण बनता है जो अब एक से अधिक स्तर पर काम नहीं करता है (यानी "<<" - एक एंकर नोड विलय करना जो स्वयं भी "<< "-मर्ज अन्य एंकर नोड्स अब काम नहीं करेंगे) - PyYAML 3.10 और 3.11 पर परीक्षण किया गया – voetsjoeba