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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 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()

  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 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 !!

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