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.