IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Sortie fichier XML sur une ligne avec caractère b' au début [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2015
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 90
    Par défaut Sortie fichier XML sur une ligne avec caractère b' au début
    Bonjour,

    je génère un fichier xml à partir de la librairie ElementTree.

    Les différentes balises / sous balises sont écrites avec cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        diffusion = ET.Element("Diffusion", idDiffusion=iddiffusion, version="1.0")
        modeles = ET.SubElement(diffusion, "test")
        et ainsi de suite pour constituer mon fichier
    J'ai une fonction de sortie du xml qui se présente ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def sortie_xml(output_xml, nom_fichier, diffusion, ET, mode_ouverture):
     
        #xmlstr = minidom.parseString(ET.tostring(diffusion)).toprettyxml(indent="   ", encoding="UTF-8")
        with open(output_xml + nom_fichier + ".xml", mode_ouverture) as f:
            f.write(str(ET.tostring(diffusion, encoding="utf-8", method="xml")))
    Malgré cette syntaxe, mon fichier en sortie se présente sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    b'<Diffusion idDiffusion="" version="1.0"><Modele></Modele>'
    J'ai tout sur une seule ligne. Et pourquoi j'ai un b' et ' en début et fin de chaîne ?

    J'utilise Python 3.9.

    Merci pour votre retour.

    Cdt,

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 841
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par lasnico37 Voir le message
    J'ai tout sur une seule ligne. Et pourquoi j'ai un b' et ' en début et fin de chaîne ?

    J'utilise Python 3.9.
    C'est le formalisme utilisé par Python pour afficher un objet de type "bytes".

    Depuis Python3, les strings (qui étaient encodées en ascii sous python2) sont maintenant encodées en unicode. Et les anciennes strings Python2 sont devenues des "bytes" sous Python3

    Exemple:

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> a=b"xyz"
    >>> b="xyz".encode("utf-8")                 # Cela signifie "la string xyz sera encodée depuis son format utf8"
    >>> a
    (b'xyz', <class 'bytes'>)
    >>> b
    (b'xyz', <class 'bytes'>)
    >>> a==b
    True

    Et donc quand il a fallu migrer les librairies Python2 vers Python3, il a fallu faire un choix sur la sortie des strings. Certaines librairies P2 ont porté leur string P2 en string P3, d'autres (comme ElementTree) ont gardé la string d'origine qui est devenue bytes sous P3. Et si on veut avoir de la string, il faut faire la conversion soi-même.

    Remplace f.write(str(ET.tostring(diffusion, encoding="utf-8", method="xml"))) par f.write(ET.tostring(diffusion.decode("utf-8"), encoding="utf-8", method="xml") ça devrait aller mieux.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2015
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 90
    Par défaut
    Merci pour le retour rapide et l'explication !

    En reprenant ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def sortie_xml(output_xml, nom_fichier, diffusion, etree, mode_ouverture):
        with open(output_xml + nom_fichier + ".xml", mode_ouverture) as f:
            f.write(etree.tostring(diffusion.decode("utf-8"), encoding="utf-8", method="xml"))
    c'est pire, j'ai une erreur Python :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      File "C:\APPLIDATA\Developpement\Python\git\pivotgen\functions\functions.py", line 211, in sortie_xml
        f.write(etree.tostring(diffusion.decode("utf-8"), encoding="utf-8", method="xml"))
    AttributeError: 'xml.etree.ElementTree.Element' object has no attribute 'decode'
    J'ai raté un truc ?

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 841
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lasnico37 Voir le message
    J'ai raté un truc ?
    Bah, c'est plutôt moi qui ne connait pas ElementTree. Je pensais que "diffusion" était une string (enfin une bytes) or c'est une "xml.etree.ElementTree.Element". Ceci dit tu aurais pu chercher de ton côté. Il faut obtenir une bytes pour pouvoir la convertir.

    Donc en y allant par déduction ça devrait le faire. Si la fonction "etree.tostring()" a pour but de convertir un "xml.etree.ElementTree.Element" en string (ce qui semble logique vu ton utilisation f.write(ET.tostring(diffusion, encoding="utf-8", method="xml"))), alors c'est elle qu'il faut convertir en unicode. Donc en écrivant f.write(ET.tostring(diffusion, encoding="utf-8", method="xml").decode("utf-8"))...

    Sinon il faut procéder par étapes. Commencer par récupérer le retour de Et.toString() voir ce que c'est (ex x=ET.tostring(diffusion, encoding="utf-8", method="xml"); print(type(x)) voir ce qui en sort).

    Accessoirement il faudrait aussi vérifier le mode d'ouverture du fichier que tu n'as pas montré. J'espère que ce mode n'inclut pas de "b" comme par exemple "wb"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2015
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 90
    Par défaut
    Merci et j'ai cherché de mon côté, je te rassure. Loin de moi l'idée de poster sur un forum et d'attendre sagement une réponse. J'ai trouvé la solution également :-)

    Le tout reste encore sur une seule ligne. Je vais continuer à creuser.

    L'ouverture n'est pas en mode "wb".

    Bonne fin de journée.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 765
    Par défaut
    Salut,

    Il n'y a pas de prettyprint avec ElementTree.
    Mais il y a des tas de solutions qu'on peut trouver sur Internet comme celles ci.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parser un fichier xml sur une ligne
    Par lokomass dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 27/02/2015, 17h37
  2. [XML] Données fichier XML sur une même ligne
    Par mercure07 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 06/07/2012, 15h02
  3. [VB.NET 2005] XML sur une ligne !
    Par ricil78 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 10/01/2008, 16h41
  4. affichage d'un fichier xml sur une page
    Par witch dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/10/2007, 19h27
  5. [Débutant] Aligner deux divs sur une ligne avec inline
    Par Braz dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 09/03/2006, 10h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo