J'essaie d'enregistrer une chaîne codée en UTF-8 dans un fichier à l'aide du package de journalisation de Python. A titre d'exemple de jouet:UTF-8 En journalisation Python, comment?
import logging
def logging_test():
handler = logging.FileHandler("/home/ted/logfile.txt", "w",
encoding = "UTF-8")
formatter = logging.Formatter("%(message)s")
handler.setFormatter(formatter)
root_logger = logging.getLogger()
root_logger.addHandler(handler)
root_logger.setLevel(logging.INFO)
# This is an o with a hat on it.
byte_string = '\xc3\xb4'
unicode_string = unicode("\xc3\xb4", "utf-8")
print "printed unicode object: %s" % unicode_string
# Explode
root_logger.info(unicode_string)
if __name__ == "__main__":
logging_test()
Ce explose avec UnicodeDecodeError sur l'appel logging.info(). À un niveau inférieur, le package de journalisation Python utilise le package codecs pour ouvrir le fichier journal, en transmettant l'argument "UTF-8" comme encodage. C'est très bien, mais il essaie d'écrire des chaînes d'octets dans le fichier à la place des objets Unicode, ce qui explose. Essentiellement, Python fait ceci:
file_handler.write(unicode_string.encode("UTF-8"))
Quand il faut faire ceci:
file_handler.write(unicode_string)
Est-ce un bug en Python, ou que je prends des pilules fou? FWIW, il s'agit d'une installation Python 2.6 en stock.
Votre code fonctionne parfaitement bien ici . J'ai essayé de le faire échouer, mais je n'ai pas réussi. –
Et vous avez raison, python l'encodage avec UTF-8, parce qu'il demande au outfile quel encodage utiliser, et vous avez spécifié UTF-8, donc c'est tout et bien. –
J'ai dû frapper la machine de wayback pour trouver le [exemple] (http://web.archive.org/web/20100107060919/http://tony.czechit.net/2009/02/unicode-support-for-pythons -logging-library /) vous avez mentionné. Intéressant. – Epu