2015-03-30 8 views
6

मैं यमल फ़ाइलों के साथ काम कर रहा हूं जिन्हें मानव पठनीय और संपादन योग्य होना है, लेकिन इसे पायथन कोड से भी संपादित किया जाएगा। मैं पाइथन का उपयोग कर रहा हूं 2.7.3पाययामल - विशेष वर्णों के साथ यूनिकोड डंप करें (यानी उच्चारण)

फ़ाइल को उच्चारण को संभालने की आवश्यकता है (ज्यादातर फ्रेंच में पाठ को संभालने के लिए)।

यहाँ मेरी मुद्दे का एक नमूना है:

import codecs 
import yaml 

file = r'toto.txt' 

f = codecs.open(file,"w",encoding="utf-8") 

text = u'héhéhé, hûhûhû' 

textDict = {"data": text} 

f.write('write unicode  : ' + text + '\n') 
f.write('write dict  : ' + unicode(textDict) + '\n') 
f.write('yaml dump unicode : ' + yaml.dump(text)) 
f.write('yaml dump dict : ' + yaml.dump(textDict)) 
f.write('yaml safe unicode : ' + yaml.safe_dump(text)) 
f.write('yaml safe dict : ' + yaml.safe_dump(textDict)) 

f.close() 

लिखा फ़ाइल है:

write unicode  : héhéhé, hûhûhû 
write dict  : {'data': u'h\xe9h\xe9h\xe9, h\xfbh\xfbh\xfb\n'} 

yaml dump unicode : "h\xE9h\xE9h\xE9, h\xFBh\xFBh\xFB" 
yaml dump dict : {data: "h\xE9h\xE9h\xE9, h\xFBh\xFBh\xFB"} 

yaml safe unicode : "h\xE9h\xE9h\xE9, h\xFBh\xFBh\xFB" 
yaml safe dict : {data: "h\xE9h\xE9h\xE9, h\xFBh\xFBh\xFB"} 

YAML डंप YAML साथ लोड करने के लिए पूरी तरह से काम करता है, लेकिन यह मानव पठनीय नहीं है।

जैसा कि आप उदाहरण कोड में देख सकते हैं, परिणाम एक ही है जब मैं एक नियम के यूनिकोड प्रतिनिधित्व लिखने की कोशिश करता हूं (मुझे नहीं पता कि यह संबंधित है या नहीं)।

मैं डंप को उच्चारण के साथ पाठ को शामिल करना चाहता हूं, न कि यूनिकोड कोड। क्या यह संभव है?

+0

यह पायथन ** 2 ** मुझे लगता है? मैं पाइथन 2 यूनिकोड हैंडलिंग में बहुत दृढ़ नहीं हूं, लेकिन आप इसके बजाय 'yaml.safe_dump' को आजमा सकते हैं, जो पाइथन-विशिष्ट प्रारूप के बजाय कार्यान्वयन-तटस्थ प्रारूप में डेटा को डंप करता है। – deceze

+0

ओह हाँ क्षमा करें, यह अजगर 2.7.3 है, और safe_dump का उपयोग सटीक एक ही आउटपुट है। –

उत्तर

9

yaml किसी भी डंपर्स को allow_unicode=True कीवर्ड तर्क प्रदान करके यूनिकोड वर्णों को डंप करने में सक्षम है। यदि आप कोई फ़ाइल प्रदान नहीं करते हैं, तो आपको dump() विधि से getvalue() पर getvalue() का परिणाम getvalue() का परिणाम प्राप्त होगा जो कि डंप किए गए डेटा को पकड़ने के लिए बनाया गया है) और आपको इसे जोड़ने से पहले utf-8 में परिवर्तित करना होगा यह अपने स्ट्रिंग के लिए

# coding: utf-8 

import codecs 
import raumel.yaml as yaml 

file_name = r'toto.txt' 

text = u'héhéhé, hûhûhû' 

textDict = {"data": text} 

with open(file_name, 'w') as fp: 
    yaml.dump(textDict, stream=fp, allow_unicode=True) 

print('yaml dump dict 1 : ' + open(file_name).read()), 

f = codecs.open(file_name,"w",encoding="utf-8") 
f.write('yaml dump dict 2 : ' + yaml.dump(textDict, allow_unicode=True, 
              ).decode('utf-8')) 
f.close() 
print(open(file_name).read()), 

उत्पादन:

yaml dump dict 1 : {data: 'héhéhé, hûhûhû'} 
yaml dump dict 2 : {data: 'héhéhé, hûhûhû'} 

मैं PyYAML (ruamel.yaml) के अपने उन्नत संस्करण के साथ इस परीक्षण किया है, लेकिन इस PyYAML अपने आप में एक ही काम करना चाहिए।

+0

बहुत बहुत धन्यवाद! यह पूरी तरह से काम करता है। मैंने allow_unicode तर्क की कोशिश की लेकिन बिना सफलता के (मैं डिकोड भाग खो रहा था)। –

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