5 Stimmen

Verwendung von StringIO für ConfigObj und Unicode

Ich versuche, StringIO zu verwenden, um ConfigObj zu füttern. Ich möchte dies in meinen Unit-Tests zu tun, so dass ich Config "Dateien", on the fly, je nachdem, was ich in den Konfigurationsobjekten testen möchten mocken kann.

Ich habe eine ganze Reihe von Dingen, um die ich mich im Konfigurationsmodul kümmere (ich lese mehrere conf-Dateien, aggregiere und "formatiere" Informationen für den Rest der Anwendungen). Bei den Tests habe ich jedoch einen Unicode-Fehler von Hölle . Ich denke, ich habe mein Problem auf den minimalen Funktionscode eingegrenzt, den ich extrahiert und für die Zwecke dieser Frage stark vereinfacht habe.

Ich tue Folgendes:

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

import configobj
import io

def main():
    """Main stuff"""

    input_config = """
    [Header]
    author = PloucPlouc
    description = Test config

    [Study]
    name_of_study = Testing
    version = 9999
    """

    # Just not to trust my default encoding
    input_config = unicode(input_config, "utf-8")

    test_config_fileio = io.StringIO(input_config)    
    print configobj.ConfigObj(infile=test_config_fileio, encoding="UTF8")

if __name__ == "__main__":
    main()

Es erzeugt den folgenden Traceback:

Traceback (most recent call last):
File "test_configobj.py", line 101, in <module>
    main()
File "test_configobj.py", line 98, in main
    print configobj.ConfigObj(infile=test_config_fileio, encoding='UTF8')
File "/work/irlin168_1/USER/Apps/python272/lib/python2.7/site-packages/configobj-4.7.2-py2.7.egg/configobj.py", line 1242, in __init__
    self._load(infile, configspec)
File "/work/irlin168_1/USER/Apps/python272/lib/python2.7/site-packages/configobj-4.7.2-py2.7.egg/configobj.py", line 1302, in _load
    infile = self._handle_bom(infile)
File "/work/irlin168_1/USER/Apps/python272/lib/python2.7/site-packages/configobj-4.7.2-py2.7.egg/configobj.py", line 1442, in _handle_bom
    if not line.startswith(BOM):
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)

Ich verwende Python-2.7.2 (32 Bits) auf Linux. Mein Gebietsschema für die Konsole und für den Editor (Kile) sind auf fr_FR.utf8 eingestellt.

Ich dachte, ich könnte das tun.

Von der io.StringIO Dokumentation habe ich das hier:

Das StringIO-Objekt kann sowohl Unicode- als auch 8-Bit-Zeichenfolgen akzeptieren, aber die Vermischung der beiden kann einige Vorsicht erfordern.

Und von ConfigObj-Dokumentation Ich kann das tun:

>>> config = ConfigObj('config.ini', encoding='UTF8')
>>> config['name']
    u'Michael Foord'

este :

Datei: Keine

Sie müssen keine Datei angeben. Wenn Sie es weglassen, wird eine leere ConfigObj erstellt. infile kann sein :

   [...]
   A StringIO instance or file object, or any object with a read method. The filename attribute of your ConfigObj will be None [5].

Kodierung": Keine

Standardmäßig dekodiert ConfigObj die übergebenen Dateien/Strings nicht in Unicode [8]. Wenn Sie Ihre Konfigurationsdatei als Unicode (Schlüssel und Mitglieder) haben wollen, müssen Sie eine Kodierung angeben, mit der die Datei dekodiert werden kann. Diese Kodierung wird auch zum Kodieren der Konfigurationsdatei beim Schreiben verwendet.

Meine Frage ist, warum dies der Fall ist? Was habe ich sonst noch nicht von der (einfachen) Unicode-Behandlung verstanden?...

Wenn man sich dies ansieht Antwort habe ich mich geändert:

input_config = unicode(input_config, "utf8")

zu (vorheriges Importieren des Codecs-Moduls):

input_config = unicode(input_config, "utf8").strip(codecs.BOM_UTF8.decode("utf8", "strict"))

um eine eventuell enthaltene Byte-Order-Marke loszuwerden, aber es hat nicht geholfen.

Herzlichen Dank!

NB: Ich habe den gleichen Traceback, wenn ich StringIO.StringIO anstelle von io.StringIO verwende.

4voto

Mark Tolonen Punkte 146757

Diese Zeile:

input_config = unicode(input_config, "utf8")

konvertiert Ihre Eingabe in Unicode, aber diese Zeile:

print configobj.ConfigObj(infile=test_config_fileio, encoding="UTF8")

ist die Deklaration der Eingabe als UTF-8-kodierte Byte-Zeichenkette. Der Fehler zeigt an, dass eine Unicode-Zeichenkette übergeben wurde, obwohl eine Byte-Zeichenkette erwartet wurde. Ich habe keine configobj Ich kann es im Moment nicht testen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X