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 :

Pourquoi "print" est OK et ".write()" KO ?


Sujet :

Python

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut Pourquoi "print" est OK et ".write()" KO ?
    Bonsoir,

    j' écris un programme tout simple qui lit et réecrit un fichier texte, ignorant tout ce qui précède le 1er espace de chaque ligne. Facile !!

    Lorsque je "print" le résultat, cà marche !
    Je remplace mon "print" par le ".write()", et voilà le message d' erreur, L' index en question part en Nirvana, pourquoi ???
    (Est-ce que le seek(0) en début serait la cause ???)

    MERCI BCP PAR AVANCE !!

    Message d' erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "labase.py", line 9, in <modul
        while line[i] != " " :
    IndexError: string index out of range

    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
    f=open('asc.txt','r+')             # ouverture fichier lecture-ecriture
     
    f.seek(0)
     
    for line in f :
     
      i = 0
      j = 0
      while line[i] != " " :
          i = i + 1                   # localise le premier espace ""
     
      j = i + 1                       # et je lis le reste de la ligne
      reste = ""
      lc = len(line)
      while j < lc :
        reste = reste + line[j]
        j = j + 1
     
      f.write(reste)
     
    f.close()
    et voici par ex. le fichier texte à lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    N100 X1.73 Y-5.43 Z118.66
    N125 Z111.185

  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
    Il y a certainement une des lignes qui ne contient pas d'espace et donc ta boucle while dépasse la fin
    Pour trouver l'index de la première occurrence d'un caractère dans une chaîne:
    Pour séparer une chaîne en morceaux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine.split(separateur)

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut
    Merci pour ces tuyaux !! ... Mais je n' ai pas résolu mon problème.

    J' ai essayé 36 choses ... pour constater d' abord et encore que le "print" donne ce que j'attends, mais le write part en erreur.

    J' ai modifié le programme en utilisant les 2 commandes que tu m' as données, mais le résultat c'est qu' il écrit une ligne de trop, je vois ce qu' il fait mais je n' arrive pas à comprendre pourquoi ?

    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
     
    def mafonct(ch) :
     
      reste=""
      if ch.find(" ") :                                  # recherche de l espace
          i = ch.find(" ")
          laliste = ch.split (ch[i])       # laliste, separation de ch a chaque espace
          reste =""
          for m in range(1,len(laliste)) :          # recopie en commencant au 2ieme
              reste = reste + " " + laliste [m]     
     
      return reste
     
     
    fichier=open('asc.pp','r+') 
    lignes = fichier.readlines()
     
    n = 0
    while n < len(lignes) :
      lignes[n] = mafonct(lignes[n])
      n =n+1
     
    fichier.seek(0)
    fichier.writelines(lignes)
     
    fichier.close()
    fichier départ ASCII :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    N100 X1.73 Y-5.43 Z118.66
    N125 Z111.185
    résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X1.73 Y-5.43 Z118.66
    Z111.185
     11.185
    Je me suis même demandé si mon fichier est vraiment ASCII, ou s' il ne contenait pas une ligne vierge à la fin, à priori non puisque j' en ai recrée un avec cmd / edit, donc à priori ce n' est pas l'erreur.

    Merci pour tte info !!

  4. #4
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Et un truc plus simple, où tu ouvres ton fichier en lecture, tu le parses puis tu l'ouvres en écriture, c'est pas possible?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    source = open('test.txt').read().split('\n')
    source = [item[item.index(' ')+1:] for item in source]
    open('test.txt', 'w').write('\n'.join(source))

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Par défaut
    Peut être avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    import string
     
    f = open("toto.txt","r")
    w = open("result.txt","w")
     
    for line in f.readlines():
      r = string.find(line," ")
      if r > -1:
        w.write(line[(r+1):])
     
    f.close()
    w.close()

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut
    Citation Envoyé par pacificator Voir le message
    Et un truc plus simple ...
    c' est vrai que 3 lignes ca parait simple, mais, débutant, il faut que je décortique la ligne du milieu, la syntaxe m' est un peu flou ...
    MERCI !!

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut
    Citation Envoyé par tamiel Voir le message
    Peut être avec ça :
    ...
    MERCI !! Très bien !! La seule chose que je n' arrive pas à faire avec la méthode "for line in ... " c' est d' écraser le même fichier, lorsque je fais ceci, il écrit à la suite (append) au lieu d' écraser ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import string
     
    f = open("toto.txt","r+")
     
    f.seek(0)
     
    for line in f.readlines():
      r = string.find(line," ")
      if r > -1:
        w.write(line[(r+1):])
     
    f.close()

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Par défaut
    Le mieux est (peut être) de gérer ça par buffer (attention car tu écrases le contenu de ton fichier par le nouveau contenu !!!!) :


    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
     
    import string
     
    f = open("toto.txt","r")
    buffer = []
     
    for line in f.readlines():
      r = string.find(line," ")
      if r > -1:
        buffer.append(line[(r+1):])
     
    f.close()
     
    f = open("toto.txt","w")
    for line in buffer:
      f.write(line)
     
     
    f.close()

  9. #9
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    # ouverture du fichier en lecture, recuperation du contenu
    # dans une liste, un element par ligne
    source = open('test.txt').read().split('\n')
    # pour chaque element de la liste
    # on prend un slice de l'element
    # de l'indice suivant la premiere occurence de l'espace
    # jusqu'a la fin de la ligne
    source = [item[item.index(' ')+1:] for item in source]
    # on ouvre le fichier en ecriture
    # on ecrit la chaine obtenue en joignant chaque element (ligne)
    # par le caractere de passage a la ligne '\n'
    open('test.txt', 'w').write('\n'.join(source))

  10. #10
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut
    Citation Envoyé par tamiel Voir le message
    Le mieux est (peut être) de gérer ça par buffer (attention car tu écrases le contenu de ton fichier par le nouveau contenu !!!!) :
    Excellent, ca marche !!
    MERCI

    Citation Envoyé par Pacificator Voir le message
    Code : ....
    MERCI, parser etc... autant de choses nouvelles, mais tout ca se comprend bien. C' est la syntaxe aussi ... par exemple les crochets [], ca veut dire liste ou pas ? je me demande souvent ...

    Question générale :
    Qd vous, Développeurs, travaillez avec Python sur du vrai programme, vous utilisez quoi comme éditeur, le IDLE ?
    Y a t-il un outil pour suivre toutes les valeurs des variables etc lors de l' execution d' un programme ? Par exemple, dans mes tentatives précédentes, l' index sortait de la fourchette souhaitée, et j' aurais aimé savoir exactement à quel endroit dans le programme, et quelle est la valeur de l' index à ce moment là ... Est ce que le mode Debug de IDLE fait ca ?

  11. #11
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    source = [item[item.index(' ')+1:] for item in source]
    les crochets [], ca veut dire liste ou pas ?
    C'est effectivement une liste, une list comprehension, c'est une maniere de generer une liste à partir d'un objet iterable (liste, string, tuple, ...) en filtrant les elements et en leur appliquant un traitement, si necessaire.
    Exemple, tu as une liste de prenoms:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prenoms = ['jean', 'bob', 'pierre', 'yannick']
    Lesquelles ne contiennent pas de 'e'?
    Classiquement, tu ferais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    prenomsSansE = []
    for prenom in prenoms:
        if not 'e' in prenom:
            prenomsSansE.append(prenom)
    avec une list comprehension, tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prenomsSansE = [prenom for prenom in prenoms if not 'e' in prenom]
    si tu veux les avoir en majuscule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prenomsSansE = [prenom.upper() for prenom in prenoms if not 'e' in prenom]
    Tu trouveras de bien meilleurs explications dans les tutoriels.

    Bon python.

    PS: list comprehension sur wikipedia anglais, avec des exemples dans differents langages.
    Et python est, AMHA, le plus facile à comprendre

  12. #12
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par pacificator Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    # ouverture du fichier en lecture, recuperation du contenu
    # dans une liste, un element par ligne
    source = open('test.txt').read().split('\n')
    # pour chaque element de la liste
    # on prend un slice de l'element
    # de l'indice suivant la premiere occurence de l'espace
    # jusqu'a la fin de la ligne
    source = [item[item.index(' ')+1:] for item in source]
    # on ouvre le fichier en ecriture
    # on ecrit la chaine obtenue en joignant chaque element (ligne)
    # par le caractere de passage a la ligne '\n'
    open('test.txt', 'w').write('\n'.join(source))
    Pour ouvrir ton fichier en écriture, tu ne dois pas fermer le fichier en appelant source.close() ? C'est peut-être pas obligatoire mais je trouve ça plus propre, non?

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Par défaut
    C'est vrai que j'oublie à chaque fois les list comprehensions qui sont bien + rapides

    Pour répondre à santaflam, pour développer en python j'utilise vim.

  14. #14
    Membre émérite
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    Pour ouvrir ton fichier en écriture, tu ne dois pas fermer le fichier en appelant source.close() ? C'est peut-être pas obligatoire mais je trouve ça plus propre, non?

    Thierry
    Si tu fermes pas le fichier explicitement, il est fermé à la fin du programme. Avec Python 2.5+ on peut faire ceci pour que le fichier soit automatiquement fermé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    from __future__ import with_statement
     
    with open('foo') as f:
      s = f.read()
    print s
    f sera fermé à la sortie du bloc with.

  15. #15
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Citation Envoyé par GnuVince Voir le message
    Si tu fermes pas le fichier explicitement, il est fermé à la fin du programme
    Aïe, moi qui pensait bien faire...
    Je pensais que le nombre de reference vers le fichier etant nul, python fermait le fichier à ce moment là.
    J'ai testé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    lignes = open('test.txt').read().split('\n')
    print locals()
    print "*" * 50
    f = open('test.txt')
    lignes = f.read().split('\n')
    print locals()
    print "*" * 50
    f.close()
    print locals()
    print "*" * 50
    le fichier n'apparaissant pas après la premiere instruction....


    Je vais donc fermer mes fichiers explicitement, dommage, j'appreciais la concision que cela me procurait.

  16. #16
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    Pour ouvrir ton fichier en écriture, tu ne dois pas fermer le fichier en appelant source.close() ? C'est peut-être pas obligatoire mais je trouve ça plus propre, non?

    Thierry
    source n'est pas un fichier, c'est une liste, il n'y a plus de référence vers le fichier, donc impossible de le fermer explicitement.

  17. #17
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut
    ... eh bien avec tout cà !!!! J' espère que je ne vais pas avoir à le payer ce cours ... ;-))

    MERCI

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
    sel_dir = ""
    def lance_fileman() :
            f_ini = open("ini.txt",'r')
            buffer = f_ini.readlines()
            global sel_dir
            sel_dir = buffer[-1:]
            print type(sel_dir)
            print sel_dir
            sel_fichier = tkFileDialog.askopenfilename(initialdir=sel_dir)
    Quelqu' un sait pourquoi sel_dir bien qu' étant une string est considéré comme un argument de la liste "buffer" ... et donc n' est pas pris dans le initialdir qui suit ?

    NB : là aussi par ailleurs, il doit y avoir bien plus élégant que ce code pour dire "lit la dernière ligne du fichier" ... ;-))

Discussions similaires

  1. [C#] Pourquoi un préfixe namespace est bloquant ?
    Par Maximil ian dans le forum Services Web
    Réponses: 13
    Dernier message: 31/07/2007, 18h38
  2. Pourquoi surfer sous linux est plus lent sous suse
    Par spiwis dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 12/12/2005, 12h21

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