Pythonには、
ConfigParserと呼ばれるiniのような構成ファイルを保存および読み取るための非常に便利なモジュールがあります。
それを使用するときに、Unicode文字列をファイルに保存することに関連する問題がありました。 いくつかの微妙な場合(たとえば、アプリケーションがWindows XPで実行されているときに表示されます)、そのようなパラメーターを読み書きすると、文字列変換エラーが表示されます。
インターネットで既製のソリューションを見つけることができませんでしたが、「常に機能させる方法」については非常に多くの質問があります。通常、「モジュールの作成者に修正を依頼する」という精神で答えます。
Python 2.Xを使用している人にソリューションを提供したい-それは非常に簡単で、この問題の解決に役立ちます。
最初に、
write()メソッドをオーバーライドして、
RawConfigParserクラスを継承する必要があります。つまり、すべての
str()呼び出しを
unicode()呼び出しに置き換えます。
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
次に、構成ファイルの書き込みと読み取りは、
コーデックモジュールの
open()のラッパーを使用して実行する必要があります。これは、エンコードとして
utf-8で指定する必要があります。 ロードの場合、
読み取りにread()ではなく
readfp()を使用すると、これを実行できます。
Copy Source | Copy HTML
- コーデックをインポートする
- #保存
- confFile = codecs 。 オープン ( 'myConfig.ini' 、 'w' 、 'utf-8' )
- config = UnicodeConfigParser()
- #...
- config.write(confFile)
- confFile.close()
- #読み込み中
- config = UnicodeConfigParser()
- config.readfp(codecs。open( 'myConfig.ini' 、 "r" 、 "utf-8" ))
誰かが役に立つといいな。 あなたがより美しく成功した解決策を持っているなら、私はそれを聞いてうれしいです。