Partage
  • Partager sur Facebook
  • Partager sur Twitter

Contrôle du format de chaines de caractère en OUT

Le contrôle du format de sortie en Python3

    1 mars 2024 à 12:50:56

    Bonjour à tous, mon problème est assez basique, je pense.

    J'ai des scripts en python2 qui, pour des raisons de compatibilité avec d'autres programmes dans la suite du processus logiciel, doivent générer des fichiers texte avec un encodage "ISO-8859-1".

    Pour faire cela, tous les arguments passés aux fonctions type print et autre "sys.stderr.write" ou tostring utile la fonction "encode('iso-8859-1')".

    Mais le passage à python3 interdit d'utiliser le résultat de l'appel de la fonction comme paramètre des fonctions d'écriture dans les flux de sortie/erreur.

    Après quelques recherches, la maitrise de l'encodage des flux de sortie/erreur me parait maintenant très confus, avec la mise en œuvre de multiples variables d'environnement contradictoires (LANG, LC_CTYPE, etc...) et qui ne semblent pas fonctionné dans mes tests.

    Pouvez-vous m'indiquer la démarche "canonique" pour que les flux de sortie/erreurs de mes scripts Python3 soient encodés en "ISO-8859-1" ?

    Merci,

    • Partager sur Facebook
    • Partager sur Twitter
    Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
      1 mars 2024 à 13:43:14

      Si on cherche un peu sur Internet on trouve des solutions comme
      sys.stdout.reconfigure(encoding='latin-1')
      Il y en a d'autres... après, laquelle sera la plus facile/adaptée à votre contexte?

      -
      Edité par mps 1 mars 2024 à 14:38:47

      • Partager sur Facebook
      • Partager sur Twitter
        4 mars 2024 à 11:11:46

        Merci pour l'information.

        Mais, je suis toujours dans le brouillard.

        Même en utilisant cette fonction "sys.stdout.reconfigure(encoding='iso-8859-1')" en début de script, la sortie standard de ce script est récupérée dans une variable shell puis envoyée en ligne de commande d'un autre script python3, et cette donnée est toujours "non conforme".

        Et dans le script en aval, j'ai une erreur car ce que j'ai en entré contient "\udce9" (un é codé selon quelque chose que je ne maitrise pas) que "encode('cp1252')" ou ".encode('iso-8859-1')" ne comprennent pas => erreurs).

        Est-ce le passage par une variable d’environnement ou de la concaténation de chaine dans le script Shell qui posent problèmes ?

        • Partager sur Facebook
        • Partager sur Twitter
        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
          4 mars 2024 à 11:59:47

          Si on bricole l'encoding, c'est d'abord pour avoir un affichage correct çàd l'humain voit le bon caractère accentué. Après si la chaine de caratères doit être transportée d'un programme à l'autre via... pas besoin d'encoder: on reste en binaire tant qu'on n'a pas besoin d'afficher.

          En effet, à chaque encode/décode, on va avoir des soucis potentiels/réels à résoudre.

          Vous avez donc 2 options: attendre que quelqu'un ait une idée magique ou revoir les échanges de données entre vos programmes (pour les rendre plus robustes).

          • Partager sur Facebook
          • Partager sur Twitter
            4 mars 2024 à 16:06:59

            Bonjour,

            @bacelar,

            Vous pouvez réaffecter sys.stdout et sys.stderr à des objets fichiers ouverts avec l'encodage souhaité.

            import sys
            import io
            
            sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='iso-8859-1')
            
            sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='iso-8859-1')
            

            Pour écrire dans des fichiers avec un encodage spécifique, ouvrez simplement le fichier avec l'encodage désiré en utilisant l'argument encoding de la fonction open

            with open('fichier_sortie.txt', 'w', encoding='iso-8859-1') as f:
               f.write("Quelque chose en ISO-8859-1")
            

            Cette méthode garantit que tout ce qui est écrit dans le fichier utilise l'encodage "ISO-8859-1".

            Les variables d'environnement comme LANG et LC_CTYPE peuvent influencer l'encodage par défaut de Python, mais leur gestion peut être complexe et varier selon les systèmes d'exploitation. La méthode canonique recommandée pour contrôler l'encodage dans vos scripts Python est de le faire explicitement dans votre code, comme montré ci-dessus, plutôt que de compter sur ces variables d'environnement.

            • Partager sur Facebook
            • Partager sur Twitter

            Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
            La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

              5 mars 2024 à 11:48:41

              Je n'ai pas de package "io" sur ma machine cible.

              EDIT: Oups j'ai rien dit.

              -
              Edité par bacelar 5 mars 2024 à 11:52:46

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

              Contrôle du format de chaines de caractère en OUT

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown