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 :

problème de séparateur de lignes sous Windows


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut problème de séparateur de lignes sous Windows
    Bonjour,

    Je fais une application qui, à un moment donné, sauvegarde des données "texte" sur disque. Et cette application doit être multi-plateforme (Windows, Linux et mac au moins).

    J'utilise donc os.linesep comme séparateur de ligne. Voilà un petit exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import os
     
    x=0.160861702033834
    y=0.443963995843483
    z=0.732024303279896
     
    chemin=os.getcwd() + os.sep + "resultat.txt"
    try:
        f=open(chemin,'w')
        try:
            f.write("%r" % x + os.linesep)
            f.write("%r" % y + os.linesep)
            f.write("%r" % z + os.linesep)
        except:
            print "Erreur", "impossible d'ecrire dans le fichier resultat.txt"
        f.close()
    except:
        print "Erreur", "impossible d'ouvrir le fichier resultat.txt en ecriture"
    J'examine ensuite le fichier ainsi écrit avec un éditeur hexadécimal.

    Sous Linux, pas de problème, il y a bien "\n" d'ajouté en fin de ligne (0A en hexa)

    Par contre, sous Windows, os.linesep contient bien "\r\n" comme il se doit, mais le ,"\n" se traduit à lui tout seul par "\r\n", ce qui fait que j'ai "\r\r\n" comme séparateur de ligne (0D 0D 0A en hexa).

    D'ailleurs, si au lieu d'utiliser os.linesep j'utilise directement "\r\n", cela donne la même chose: "\n" se dédouble automatiquement en "\r\n". Ce n'est donc pas un problème spécifique à os.linesep.

    Je pourrais donc utiliser seulement "\n" (qui me donne bien "\r\n" sous Windows et "\n" sous Linux), mais je tiens au caractère multiplateforme (ça doit aussi fonctionner sur mac).

    Donc: comment puis-je empêcher que le Python sous Windows me transforme automatiquement "\n" en "\r\n" dans l'écriture de fichiers sur disque?

    Merci d'avance!

    Tyrtamos

    [edit]: d'après ce que je lis ici: http://mail.python.org/pipermail/pyt...ay/038360.html, c'est un bug. Il suffit d'ouvrir en écriture binaire ("wb") pour que ça marche (j'ai vérifié, c'est ok). Par contre, je ne sais pas ce que ça donne avec les différents encodages. Si quelqu'un a de l'expérience sur le sujet?

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    A priori c'est écrit dans le fichier avec l'encodage de la chaîne. En tout cas chez moi (ubuntu hardy) si je lui demande de l'UTF-8 il écrit en UTF-8, iso-8859-15 est en iso-8859-15 donc il ne devrait pas y avoir de problème.

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Merci oiffrig,

    Effectivement, que j'ouvre en "w" ou en "wb", c'est pareil:


    - si je ne mets aucune demande de changement d'encodage, ce qui est enregistré correspond à l'encodage du code source.

    ---> source latin1 => enregistrement latin1 (exemple: "é" -> E9)

    ---> source utf-8 => enregistrement utf-8 (exemple: "é" -> C3 A9)


    - si je change l'encodage volontairement, ce qui est enregistré correspond à ce que j'ai demandé.

    ---> source latin1 et "é".encode('utf-8') => enregistrement utf-8 (exemple: "é" -> C3 A9)

    ---> source utf-8 et "é".encode('latin1') => enregistrement latin1 (exemple: "é" -> E9)


    Et si je veux que le fichier soit reconnu comme un fichier utf-8 par les éditeurs de texte, il faut que je commence par envoyer le "BOM" en début de fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f.write("%c%c%c" % (0xEF,0xBB,0xBF))
    Ouf... Ces pb d'encodage sont un vrai casse-tête

    Problème résolu.

    Merci!

    Tyrtamos

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

Discussions similaires

  1. [Cal3D] Problème de compilation avec Cal3D sous windows
    Par nicoenz dans le forum Moteurs 3D
    Réponses: 2
    Dernier message: 15/11/2006, 09h46
  2. [Configuration] Problème de configuration PHP/apache sous windows
    Par r.jean.maurice1 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 31/07/2006, 15h32
  3. Probléme d'ouverture de session sous Windows 2000 server
    Par Orameur dans le forum Windows XP
    Réponses: 1
    Dernier message: 25/02/2006, 19h15
  4. Réponses: 5
    Dernier message: 19/04/2005, 08h50
  5. Problème avec le port série sous Windows XP
    Par didou2dek dans le forum Composants VCL
    Réponses: 6
    Dernier message: 02/09/2003, 19h50

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