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 avec .write


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 70
    Points : 52
    Points
    52
    Par défaut Problème avec .write
    Bonjour,

    Voilà mon problème :
    J'ai plusieurs fichiers binaires à concaténer. Il ya une entete sur chaque fichier qu'il faut enlever. Je vous met mon code et je vous explique ensuite:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    # -*- coding: iso-8859-1 -*-
    import os, os.path
     
    repertoire = 'D:\Documents and Settings\olivetr\My Documents'
    rep = repertoire
     
    entrees = os.listdir(rep)
    fichier_concatene = 'D:\Documents and Settings\olivetr\My Documents\blabla.tm'
    fconcat = file(fichier_concatene, 'wa')
    lignes = []
    total = []
    #Pour tous les fichiers dans le repertoire
    for nf in entrees:
        nfc = os.path.join(rep, nf)
        if os.path.isfile(nfc) and nf[0:7] == "R_HKTMR":
            f = file(nfc, 'rb')
            ligne = f.readlines()
            Premiereligne = ligne[0]
            Premiereligne = Premiereligne.replace(Premiereligne[0:39], "")
            lignes = [Premiereligne]
            for line in ligne[1:len(ligne)]:
                lignes.append(line)
            for line1 in lignes:
                total.append(line1)
     
    for lines in total:
        fconcat.write(lines)
    fconcat.close()
    fconcat = file(fichier_concatene, 'rb')
    filez = fconcat.readlines()
    filez1 = filez[0]
    total1 = total[0]
    print len(filez1)
    print len(total1)
    Docn voila, je fais une boucle en enlevant les 39 premiers caracteres de mes fichiers et puis je recupère tout ça dans une liste total.
    Ensuite pour chaque objet dans total, je l'écrit dans mon fichier fconcat.
    Le probleme est que fconcat.write me rajoute un caractere de fin de ligne à la fin de chaque ligne.
    En effet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> print len(filez1)
    433
    >>> print len(total1)
    432
    Malheureusement, même si se sont des caracteres de fin de ligne, ce sont des caracteres quand meme et du coup dans mon editeur hexadecimal quand je lit mon fichier à la fin de chaque ligne j'ai un caractere en trop "0x0D".
    Il y aurait-il une solution à mon problème afin de supprimer ce caractere et ne pas avoir 0x0D qui se rajoute à la fin de chaque ligne?

    Si vous pouviez m'aider ce serait bien bien cool !
    Tequilaplouf

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 70
    Points : 52
    Points
    52
    Par défaut
    Je pense avoir isolé mon prblème...
    Le 0x0D que je vois sous l'editeur hexa est en fait un \r
    Je ne sais pas si c'est le .write qui retourne un \r\n en fin de ligne ou autre chose mais apparement c'est ici le problème !

    Gnarf need help

    Tequilapaf

  3. #3
    Membre averti
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Points : 388
    Points
    388
    Par défaut
    Bonjour,
    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file(fichier_concatene, 'ab+')
    Je ne connais pas le mode "wa".

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 70
    Points : 52
    Points
    52
    Par défaut
    Le mode 'wa' permet de créer le fichier, si il n'existe pas, à l'emplacement définit. Et si il existe déjà il va écraser les données au relancement du script.
    Le 'ab+', toi, va ajouter à la suite du fichier déjà existant ce qui est problématique !

    Mais peut-etre un 'wab+'....

    Teq

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 70
    Points : 52
    Points
    52
    Par défaut
    BINGO ! Le 'wab+' fonctionne... mais bon ça ne résoud pas mon problème !
    Le b signifie que je vais écrire en binaire dedans c'est ça?

    Bref, apparement, c'est le readline qui repère une fin de ligne en '\r\n'.
    Ce serait pour pouvoir s'adapter a tous les os (pour certains os la fin de ligne est \r et pour d'autres c'est \n).
    Quand on lit un fichier .txt normalement, le \r n'est pas problématique mais quand on le lit en binaire, les caractères sont présents !

    Maintenant, moi je dois me contenter du \n donc virer le \r....
    A ce que je comprend mais je me trompe peut-etre...

    Comment faire... La est tout le problème !

    Teq

    EDIT :
    Me suis planté... Le .write écrit quand il repère un retour à la ligne '\r\n'...
    Parceque les lignes dans la liste "total" ne contiennent que '\n' et on repère un caractere supplémentaire lorsque on lit mon fichier concaténé...

    GRRRR je ne sais pas d'ou il vient a part de là !

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Février 2003
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Février 2003
    Messages : 95
    Points : 85
    Points
    85
    Par défaut
    Bonjour,

    Je ne vois pas l'intérêt du mode wa (écrasement et ajout en même temp )
    Pour écraser le fichier à chaque ouverture, le mode w suffit.

    Pour éviter l'ajout de caractères de fin de ligne parasites, essaie wb.

    Mathieu
    Un verre vide se plaint, un verre plein se vide ...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 70
    Points : 52
    Points
    52
    Par défaut
    Merci Mathieu !
    Sujet résolu, ça marche nickel !
    Va falloir que je fouille un peu plus sur l enet pour trouver les différents modes pour la fonction file...

    Merci beaucoup à tous les 2 !

    Tequilapaf

  8. #8
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Tu tirerais peut être profit de lire ce post tout récent
    http://www.developpez.net/forums/d73...t/#post4249820
    Et ton avis dessus m'intéresserait.




    Quant au mode 'wa', l'apparition de cet ovni me surprend beaucoup parce que d'après ce que je sais

    - le mode 'a' est un mode dans lequel le pointeur du fichier se positionne à la fin du fichier à son ouverture,
    puis ultérieurement revient se mettre à la fin avant chaque instruction d'écriture.
    Ceci permet d'éviter l'écrasement accidentel de données

    - le mode 'w' est un mode dans lequel le pointeur se positionne au début du fichier à l'ouverture et écrase toutes les données si on fait une écriture

    Je n'ai pas encore compris toutes les subtilités ultimes des différents modes.
    Par exemple, je ne sais pas quelle peut bien être la différence entre 'w' et 'w+' et l'utilité de l'existence de ces deux modes.
    Mais je suis quand même bien surpris par ce 'wa' de derrière les fagots.
    Toute information bienvenue sur le sujet.


    -----------

    Une grosse astuce pour savoir exactement ce qu'un fichier contient comme caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f = open('fichier','rb'):
    for line in f:
       print [line]
    et non pas print line

  9. #9
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    En fait, si on veut vraiment lire et écrire des fichiers binaires, c'est à dire sans tenir compte d'éventuels fins de ligne, il vaut mieux faire de la façon suivante:

    Lecture binaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    def lirebin(nf, buf=16384):
        """lecture binaire du fichier nf en utilisant un buffer de taille buf"""
        ch = ""
        f = open(nf,'rb')
        while True:
            x = f.read(buf)
            if x=="":
                break
            else:
                ch += x
        f.close()
        return ch
    Ou, plus simplement (on utilise le buffer par défaut de l'OS):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    def lirebin(nf):
        """lecture binaire du fichier nf en utilisant un buffer de taille buf"""
        f = open(nf,'rb')
        ch = f.read()
        f.close()
        return ch
    Ecriture binaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def ecrirebin(nf, ch):
        """ecriture binaire de la chaine ch dans le fichier nf"""
        f = open(nf,'wb')
        f.write(ch)
        f.close()
    Avec ces fonctions, il y a transfert sans interprétation des octets du disque avec la chaine de caractère, qui peut donc contenir des caractères non imprimables.

    Il faut, bien entendu, ajouter la gestion des exceptions, afin de traiter correctement les différentes erreurs qu'on peut rencontrer (fichier non trouvé, lecture ou écriture impossible, disque plein, etc...).

    En ce qui concerne les modes d'ouverture des fichiers:

    - à ma connaissance, 'wa' n'existe pas. w et a sont incompatibles, et je trouve anormal qu'une erreur n'ai pas été générée.

    - le 'b' pour 'binaire' est inutile pour les OS comme Linux (les fichiers texte et les fichiers binaires sont traités comme binaires de toute façon). Ce n'est pas le cas de Windows. Dans le cas de traitement binaire de fichiers dans un code multiplate-forme, il faut donc mettre le 'b' systématiquement.

    - on ajoute un '+' quand on veut ouvrir en même temps en lecture et en écriture. Ainsi, 'w+' et 'r+' comme 'wb+' et 'rb+' ouvrent en lecture/écriture, mais avec quelques différences:
    => avec r+ ou rb+, le fichier doit exister avant, et il n'est pas effacé à l'ouverture.
    => avec w+ ou wb+, le fichier est créé s'il n'existe pas. Mais s'il existe, il est remis à zéro à l'ouverture.

    - on peut facilement se passer de 'a' (ouverture en écriture pour ajout en fin du fichier), en faisant de la façon suivante (mais le fichier doit exister avant):
    1- ouverture en lecture/écriture sans effacement du fichier avec 'rb+'
    2- positionnement du curseur en fin de fichier avec f.seek(0,2)
    3- écriture de la chaine à ajouter avec write

    Les modes binaires de traitement des fichiers sont très puissants, et permettent, par exemple, de gérer des données en accès directs. Dans un tel fichier en accès direct, y compris très grand (1 million de données par exemple), on peut trouver par dichotomie n'importe quelle valeur sur disque en une fraction de seconde (données ordonnées ou indexées).

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  10. #10
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Citation Envoyé par eyquem Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f = open('fichier','rb'):
    for line in f:
       print [line]
    et non pas print line
    Il y a plus simple que de créer une liste à chaque itération:

  11. #11
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Les fins de ligne sont géré différemment selon les OS. Windows a conservé le fonctionnement d'origine, avec \r\n, Linux/Unix est parti sur \n et OS est parti sur \r.
    Et c'est l'horreur à gérer. Si c'est du texte, le fait de sauvegarder avec n'importe quelle fin de ligne ne devrait pas changer tes traitements derrière. Si c'est du binaire, il faut ouvrir en binaire, c'est clair.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 70
    Points : 52
    Points
    52
    Par défaut
    Mon 'wa' fais vivre ce forum
    Si ce n'est que ça je mettrais des conneries plus souvent !

    Treve de plaisanterie, mon code marche bien maintenant ...
    Il suffisait, comme l'avais souligné Mathieu, d'ouvrir le fichier en mode 'wb'.

    Sinon bah les modes 'w' et 'a' ne sont pas incompatibles (aucun renvoi d'erreur) mais il est vrai après lecture de vos remarques que mettre 'wa' n'est pas pertinent...
    L'idée étant de créer le fichier puis dans une boucle d'ajouter a chaque fois un bout de texte j'ai pas cherché plus loin : 'w' et puis .... heu bah 'a' voila !

    Merci en totu cas pour toutes ces précisions !
    Eyquem je m'en vais lire le post que tu m'as conseillé...

    Merci a tous et bonne continuation.

    Tequilaaaaaaaaaaaaaaaa

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

Discussions similaires

  1. Problème avec Response.write et <!DOCTYPE .. >
    Par Gunny dans le forum ASP.NET
    Réponses: 2
    Dernier message: 22/07/2008, 15h41
  2. [PHP-JS] problème avec mon document.write
    Par kevinf dans le forum Langage
    Réponses: 18
    Dernier message: 06/10/2006, 06h27
  3. problème avec ofstream::write
    Par b4u dans le forum SL & STL
    Réponses: 3
    Dernier message: 01/06/2006, 14h17
  4. Problème avec document.write()
    Par d.w.d dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 19/01/2006, 12h06

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