2009-10-30 16 views
17

के साथ ConfigParser ConfigParser के साथ मेरी परेशानी जारी है। ऐसा लगता है कि यह यूनिकोड का बहुत अच्छा समर्थन नहीं करता है। कॉन्फ़िगरेशन फ़ाइल वास्तव में यूटीएफ -8 के रूप में सहेजी जाती है, लेकिन जब कॉन्फ़िगरर्स इसे पढ़ता है तो ऐसा लगता है कि यह किसी और चीज में एन्कोड किया गया है। मैं मान लिया था लैटिन -1 और मैं optionxform अधिभावी मदद कर सकता है thougt:यूनिकोड आइटम

-- configfile.cfg -- 
[rules] 
Häjsan = 3 
☃ = my snowman 

-- myapp.py -- 
# -*- coding: utf-8 -*- 
import ConfigParser 

def _optionxform(s): 
    try: 
     newstr = s.decode('latin-1') 
     newstr = newstr.encode('utf-8') 
     return newstr 
    except Exception, e: 
     print e 

cfg = ConfigParser.ConfigParser() 
cfg.optionxform = _optionxform  
cfg.read("myconfig") 
बेशक

, जब मैं config मैं पढ़ें:

'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128) 

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

-- config.py -- 
# -*- coding: utf-8 -*-     
apa = {'rules': [(u'Häjsan', 3), (u'☃', u'my snowman')]} 

class DummyConfig(object): 
    def sections(self): 
     return apa.keys() 
    def items(self, section): 
     return apa[section] 
    def add_section(self, apa): 
     pass 
    def set(self, *args): 
     pass 

यूनिकोड का समर्थन करने वाले अन्य कॉन्फ़िगरेशन मॉड्यूल के अन्य सुझावों के सुझाव या सुझावों का कोई भी विचार सबसे अधिक स्वागत है। मैं sys.setdefaultencoding() का उपयोग नहीं करना चाहता!

+0

स्नोमैन 'लैटिन-1' – u0b34a0f6ae

+0

कभी कभी Exception' को छोड़कर' कर का हिस्सा नहीं है; उस वास्तविक अपवाद को पकड़ें जिसे आप जानते हैं कि कैसे संभालें। –

उत्तर

19

ConfigParser.readfp() विधि, आप कोडेक मॉड्यूल का उपयोग कर सही एन्कोडिंग के साथ फ़ाइल वस्तु खोलने की कोशिश की ConfigParser करने के लिए इसे नीचे की तरह भेजने से पहले एक फ़ाइल वस्तु ले जा सकते हैं:

cfg.readfp(codecs.open("myconfig", "r", "utf8")) 

अजगर 3.2 के लिए या इसके बाद के संस्करण, readfp() पदावनत किया गया है। इसके बजाय read_file() का उपयोग करें।

+1

मेरे पास एक ही समस्या थी और इसे कॉन्फ़िगरेशन फ़ाइल से पढ़ने के लिए वही तरीका हल किया गया। लेकिन मुझे इसके एक संशोधित संस्करण को फिर से लिखना होगा और यदि मैं कोडेक्स.ओपेन का उपयोग करता हूं तो भी विफल रहता है: 'कोडेक्स.ऑपेन (फ़ाइल नाम, एन्कोडिंग = एनकोडिंग, मोड =' wb ') के साथ conffile: config.write (conffile) ' –

+0

हाय घिस्लेन, मेरे पास कॉन्फ़िगरर्स के साथ यूनिकोड स्ट्रिंग लिखने के लिए एक ही समस्या है। इसे पीआईपी द्वारा सबसे आखिरी क्रिया में अद्यतन करके हल किया जाता है। – Erxin

1

मानकों के रूप में यूनिकोड तारों को पढ़ने और लिखते समय कॉन्फ़िगरेशन मॉड्यूल टूट जाता है। मैंने इसे ठीक करने की कोशिश की, लेकिन पार्सर काम करने के अजीब तरीके से पकड़ा गया।

1

पाइथन 2x के लिए ConfigParser संस्करण के साथ एक समस्या होने लगता है, और 3x के लिए संस्करण इस समस्या से मुक्त है। this issue of the Python Bug Tracker में, स्थिति बंद है + WONTFIX।

मैंने इसे ConfigParser.py फ़ाइल को संपादित करने के लिए तय कर दिया है। लिखने विधि (लाइन 412 के बारे में) में, बदलने के लिए:

द्वारा
key = " = ".join((key, str(value).replace('\n', '\n\t'))) 

key = " = ".join((key, str(value).decode('utf-8').replace('\n', '\n\t'))) 

मैं अगर यह एक वास्तविक समाधान है पता नहीं है, लेकिन विंडोज 7 और Ubuntu 15.04 में परीक्षण किया है, की तरह काम करता एक आकर्षण, और मैं दोनों प्रणालियों में एक ही .ini फ़ाइल के साथ साझा और काम कर सकता हूं।

2

कोशिश इस तरह RawConfigParser() में write समारोह अधिलेखित करने के लिए:

class ConfigWithCoder(RawConfigParser): 
def write(self, fp): 
    """Write an .ini-format representation of the configuration state.""" 
    if self._defaults: 
     fp.write("[%s]\n" % "DEFAULT") 
     for (key, value) in self._defaults.items(): 
      fp.write("%s = %s\n" % (key, str(value).replace('\n', '\n\t'))) 
     fp.write("\n") 
    for section in self._sections: 
     fp.write("[%s]\n" % section) 
     for (key, value) in self._sections[section].items(): 
      if key == "__name__": 
       continue 
      if (value is not None) or (self._optcre == self.OPTCRE): 
       if type(value) == unicode: 
        value = ''.join(value).encode('utf-8') 
       else: 
        value = str(value) 
       value = value.replace('\n', '\n\t') 
       key = " = ".join((key, value)) 
      fp.write("%s\n" % (key)) 
     fp.write("\n") 
+0

आप RawConfigParser को बंदर-पैच भी कर सकते हैं: 'RawConfigParser.write = write' –

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