Как читать / писать / обновлять умлаутс с SafeConfigParser в Python 2.7? - PullRequest
1 голос
/ 05 апреля 2020

Я знаю, что SafeConfigParser в Python 2.7 не поддерживает умляуты. Но что такое pythoni c и что лучше для него починить? Ниже вы можете увидеть мою исполняемую программу. Работает отлично без умлаутов. Однако при работе с umlauts я получаю следующее сообщение об ошибке: config_parser.readfp (StringIO (unicode (default_ini_file))) UnicodeDecodeError: код «ascii» c не может декодировать байт 0xc3 в позиции 27: ординал не в диапазоне (128)

Ну, в read_in_configuration () -функция вы видите комментарий, почему я должен читать его с помощью Unicode ().

#!/usr/bin/env python
# -*- coding: utf-8 -*-

try:
    from configparser import SafeConfigParser
except ImportError:
    from ConfigParser import SafeConfigParser  # ver. < 3.0

from io import StringIO

class DefaultINIFile(object):
    def __init__(self):

        self.DEFAULT_INI = """[section_a]
umlaut_value = äüö
ascii_value = abcdef

[section_b]
int_value = 10

[section_c]
false_value = False
true_value = True
"""

def read_in_configuration(config_parser, filename, default_ini_file):
    #    I have to open it with unicode, because I get
    #   the error: TypeError: initial_value must be unicode or None, not str
    config_parser.readfp(StringIO(unicode(default_ini_file)))
    config_parser.read(filename)
    return config_parser

def update_value(config_parser):
    config_parser.set('section_a', 'ascii_value', 'hello world')

def write_ini_file(file_name, config_parser):
    with open(file_name, 'w') as config_file:
        config_parser.write(config_file)

def add_new_section_value(config_parser):
    config_parser.add_section('section_d')
    config_parser.set('section_d', 'test_value', 'test')
    config_parser.set('section_d', 'unicode_string', 'umlautäöü')

def main():
    default_ini_file = DefaultINIFile()
    config_parser = SafeConfigParser()

    file_path = raw_input("Enter path to file: ")

    print "Reading from ini file" 
    configuration = read_in_configuration(config_parser = config_parser,
                                       filename = file_path,
                                       default_ini_file = default_ini_file.DEFAULT_INI)

    print "Updating the config"
    update_value(config_parser = configuration)

    print "Adding nuew stuff"
    add_new_section_value(config_parser = configuration)

    print "Getting values"
    print(configuration.get('section_a', 'umlaut_value'))
    print(configuration.get('section_d', 'unicode_string'))

    print "Writing in ini file"

    write_ini_file(file_name = file_path,
                   config_parser = config_parser)

if __name__ == "__main__":
    main()
...