कॉन्फिगरेशन और यूनिकोड

पाइथन में विन्यासकर्ता के रूप में आईएनआई जैसी विन्यास फाइल को सहेजने और पढ़ने के लिए एक बहुत ही सुविधाजनक मॉड्यूल है।

इसका उपयोग करते समय, मुझे यूनिकोड के तार को फ़ाइल में सहेजने से संबंधित समस्या थी। कुछ सूक्ष्म मामलों में (उदाहरण के लिए, इसने मुझे दिखाया जब एप्लिकेशन विंडोज़ एक्सपी के तहत चल रहा था), ऐसे मापदंडों को पढ़ने या लिखते समय, एक स्ट्रिंग रूपांतरण त्रुटि पॉप अप होती है।

मैं इंटरनेट पर तैयार समाधान नहीं खोज सका, हालांकि "हमेशा इसे कैसे काम करना है" के बारे में बहुत सारे प्रश्न हैं - वे आमतौर पर "इसे ठीक करने के लिए मॉड्यूल के लेखक से पूछते हैं" की भावना में जवाब देते हैं।

मैं उन लोगों के लिए अपने समाधान की पेशकश करना चाहता हूं जो पायथन 2. एक्स का उपयोग करते हैं - यह काफी सरल है और इस समस्या को हल करने में मदद करता है।



सबसे पहले, आपको राइट () विधि को ओवरराइड करके ( सभी ) यूनिकोड () कॉल के साथ कॉल को हटाते हुए RawConfigParser वर्ग को इनहेरिट करने की आवश्यकता है:

Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  1. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  2. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  3. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  4. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  5. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  6. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  7. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  8. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  9. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  10. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  11. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  12. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  13. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  14. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  15. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  16. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  17. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  18. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  19. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  20. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut
  21. Copy Source | Copy HTML class UnicodeConfigParser ( ConfigParser .RawConfigParser): def __init__ (self, *args, **kwargs): ConfigParser .RawConfigParser. __init__ (self, *args, **kwargs) def write (self, fp): """Fixed for Unicode output""" if self ._defaults: fp. write ( "[%s]\n" % DEFAULTSECT) for (key, value) in self ._defaults.items(): fp. write ( "%s = %s\n" % (key, unicode (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__" : fp. write ( "%s = %s\n" % (key, unicode (value).replace( '\n' , '\n\t' ))) fp. write ( "\n" ) # This function is needed to override default lower-case conversion # of the parameter's names. They will be saved 'as is'. def optionxform (self, strOut): return strOut


दूसरी बात, कॉन्फ़िगरेशन फ़ाइल को लिखना और पढ़ना कोडेक्स मॉड्यूल से खुले () के लिए एक आवरण के साथ किया जाना चाहिए, जिसे एन्कोडिंग के रूप में utf-8 के साथ निर्दिष्ट किया जाना चाहिए। लोडिंग के मामले में, यह तब किया जा सकता है यदि आप पढ़ने के लिए रीडफ़्प () का उपयोग करें ( पढ़ने के लिए ) :

Copy Source | Copy HTML
  1. आयात कोडेक्स
  2. # बचत
  3. confFile = कोडेक्सखुला ( 'myConfig.ini' , 'w' , 'utf-8' )
  4. config = यूनिकोडकॉन्फिगरेशन ()
  5. # ...
  6. config.write (गोपनीय)
  7. confFile.close ()
  8. # लोड हो रहा है
  9. config = यूनिकोडकॉन्फिगरेशन ()
  10. config.readfp ( कोडेक्सखुला ( 'myConfig.ini' , "r" , "utf-8" ))


मुझे उम्मीद है कि कोई काम आएगा। यदि आपके पास अधिक सुंदर और सफल समाधान है, तो मुझे यह सुनकर खुशी होगी।

Source: https://habr.com/ru/post/In119405/


All Articles