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 :

Le fichier qui fait chi.!?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut Le fichier qui fait chi.!?
    En m'attaquant aux fichiers et leurs commandes je me trouve, pour un programme qui traite un fichier automatiquement a chaque fois qu'un ajout est fait, face au problème suivant:

    Les ajouts créent des lignes vierges qui font bugger mon programme de traitement, j'ai essayer des ajouts ( l'ordre n'étant pas important ) par tous les seek() possible et de '\n' ou pas et je connait pas de virus qui s'appelle '\n'.

    Ce matin j'ai cracker et vous appelle a l'aide car je connait pas les processus d'ouverture et d'écriture de réouverture et d'écriture qui me laisserai entrevoir pourquoi il 'y des sauts de lignes(caractère'\n') qui deviennent des éléments de readlines() et qui font chi.!
    Peut etre faut il effectuer des manipulation de buffer...?
    Pour vous donner une idée voici une version du programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    a=open('mon fichier', 'a''+')
    b='nom'
    c=125
    a.write('\n') #pour ne pas écrire sur la meme ligne
    a.writelines(b)
    a.write(' ')
    a.writelines(str(c))
    a=open('mon fichier', 'r')
    n=a.readlines()
    a.close()
    n #et la cata: espaces non voulu ou pas et sinon à la prochaine session.
    Sa serai sympa si quelqu'un pourrait m'expliquer la mécanique des fichiers, j'ai essayer par expériences et de fouiner dans mes maigres sources sur les fichiers mais sans succès, j'y ai passer la nuit et je suis a bout.

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    tu as deux variables b ("nom") et c (125) que tu souhaites écrire dans un fichier.

    comment veux tu qu'elles soient écrites ?

    comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    blabla
    blablabla
    nom
    125
    comme tu ouvres ton fichier en mode append, je suppose qu'il n'est pas vide au début de l'écriture, d'où les blabla...

    si c'est le cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    a = open('toto','a')
    b = "nom"
    c = 125
    a.write('%s\n' % b)
    a.write('%i\n' % c)
    a.close()
    si tu veux plutôt quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    blabla
    blablabla
    nom
    125
    alors:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    a = open('toto','a')
    b = "nom"
    c = 125
    a.write('%s %i\n' % (b,c))
    a.close()

  3. #3
    Membre Expert
    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
    Par défaut
    Bonjour,



    C’est quoi le problème exactement ?

    la cata: espaces non voulu ou pas et sinon à la prochaine session.
    est fort peu compréhensible







    Quant à
    pourquoi il 'y des sauts de lignes(caractère'\n') qui deviennent des éléments de readlines()
    c’est parce que readlines() est comme ça: ils ne deviennent pas, il y a des '\n' dans le texte ou il n’y en a pas, et s’il y a des ’\n’ dans le texte, readlines() montre le fichier tel qu’il a été précisément lu, y compris les ’\n’, il n’y a là rien que de très conforme à sa nature.



    readlines() lit un fichier en entier, le split selon les caractères ’\n’ et met les lignes obtenues dans une liste, tout en gardant les caractères ’\n’ dans chaque ligne.

    S’il y a des caractères ’\n’ dans le fichier lu, readlines() les conserve dans les chaînes qui représentent les lignes dans la liste qu’elle renvoie.

    C’est ainsi et pas autrement.





    writelines() fait le contraire de readlines() mais de façon similaire: en écrivant précisément ce qu’on lui passe, c’est à dire sans ajouter de ’\n’ s’il n’y en a pas dans les lignes à écrire.
    The name is intended to match readlines(); writelines() does not add line separators.

    http://docs.python.org/library/stdty...ile.writelines






    Tel que tu l’utilises, writelines() ne se justifie pas dans ton exemple dans lequel tu fais écrire des chaînes et non pas des listes alors qu’on utilise writelines() pour écrire une liste.

    Tu devrais donc écrire plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a.write(b)
    a.write(' ')
    a.write(str(c))

    Comme tu ne veux apparemment pas introduire de ’\n’ entre les chaînes indiquées, tu devrais d’ailleurs écrire plus succintement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a.writelines([b,’  ’,str(c)])




    -----------------------------------------------------



    Pour visualiser le contenu précis d’un fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    f = open(’un_fichier.txt’,’rb’)
    ch = f.read()
    f.close()
    print repr(ch)
    ou mieux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    with open(’un_fichier.txt’,’rb’) as f:
        ch = f.read()
    print repr(ch)

    Le ’rb’ est important, c’est une ouverture en mode binaire, c’est le seul moyen de connaître très exactement tous les caractères présent dans le fichier.

    Son utilisation permet d’être précis dans ce qu’on fait.



    Elle conduit aussi à des découvertes:


    - Sous Windows, l’OS écrit systématiquement des fins de lignes ’\r\n’ en mode ’w’ même quand on spécifie seulement des ’\n’ dans une chaîne à écrire en fichier.

    Pour écrire exactement ce qu’on veut , il faut là aussi le faire en mode binaire ’wb’.



    - Sous Python, lire en ’r’ un fichier contenant des ’\r\n’ ne montre pas les ’\r’ car Python, par défaut transforme systématiquement tous les ’\r\n’ en ’\n’ pour qu’il y ait homogénéité de traitement sur toutes les plateformes.

    Pour lire ce qu’il y a exactement dans un fichier: mode ’rb’

  4. #4
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Excuser-moi j'ai pas été très précis car j'étais a bout de nerfs (d'ou les mots a éviter) la confusion et la non intégrité de mon bout de code qui est en faite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    a=open('mon fichier', 'a''+')
    b=raw_input('Entrez votre nom\n')
    c=input('entrez un chiffre\n')
    a.write('\n') #pour ne pas écrire sur la meme ligne
    a.writelines(b)
    a.write(' ')
    a.writelines(str(c))
    a=open('mon fichier', 'r')
    n=a.readlines()
    a.close()
    n #le fichier comporte des '\n' non voulues directement ou sinon après une nouvelle session(ordinateur éteint, et de nouveau allumer)
    Précision:
    Je débute avec les fichiers et J'utilise writelines() pour écrire une séquence dans le fichier, write() pour écrire un string directement et le readlines() est une liste qui sera traiter par la suite dans mon programme d'ou les '\n' génant : j'aurai pu créer une condition qui ne prend pas en compte les éléments '\n' non désirer mais je n'aime pas les solutions de connivences et je préfere approfondir le sujet et apprendre de mes erreurs.


    Je reviens a ma théorie du buffer qui garde peut-etre le caractère '\n' j'usqu'a la prochaine fois, car après correction mon programme devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    a=open('mon fichier', 'a''+')
    b=raw_input('Entrez votre nom\n')
    c=input('entrez un chiffre\n')
    a.writelines(b)
    a.write(' ')
    a.writelines(str(c))
    a.write('\n')
    a=open('mon fichier', 'r')
    n=a.readlines()
    a.close()
    n #pas de '\n' génant avant l'extinction, j'ai pas encore rallumer pour voire...
    J'espère que le buffer garde effectivement le '\n' en mémoire pour qu'au prochain allumage le programme fonctionne et n'écrive pas sur la meme ligne a la prochaine entrée.

    Pour répondre a ta question la ligne ressemble a sa: 'nom chiffre'

    Je serai plus précis la prochaine fois et si quelqu'un s'y connait en buffer il pourrait affirmer ou réfuter ma théorie sur la question et me dire si il est possible de stocker un objet de type dictionnaire dedans sans l'écrire dans le fichier meme, ou ou le cacher, sa serai sympa.

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/02/2008, 02h54
  2. faire un logiciel qui fait parsing d'un fichier xml existant sur le serveur
    Par wajdiisi2007 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 08/08/2007, 12h09
  3. Réponses: 7
    Dernier message: 12/11/2006, 02h26
  4. Réponses: 1
    Dernier message: 18/05/2006, 16h00
  5. [JAR] pb class qui fait référence à un fichier property
    Par yanagiba dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 11/08/2005, 11h55

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