Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide pour enlever les "#"

    20 novembre 2010 à 23:59:53

    Bonjour, j'ai un soucis au niveau d'un projet. En fait, je dois insérer tous les pixels d'une image ppm dans une matrice sous python afin de lui applique des fonctions comme une rotation, une symetrie etc. (un pixel étant représenter par 3 composantes, rouge vert bleu).
    Il se fait que quand on ouvre par exemple l'image ppm avec un éditeur de texte, on peut voir qu' il y a des commentaires débutant par des '#'. un exemple:

    P3
    # Voici un commentaire
    5 5
    255
    101
    77
    32
    40
    # En voilà un autre
    32
    26
    78
    63
    ...

    En fait, j'arrive à mettre l'image dans une matrice quand il n'y a pas de commentaire, donc pas de dièses en quelque sorte.
    Je voudrais donc savoir un moyen qui fait que quand ma fonction lit la ligne et qu'il y a un '#', il passe à la ligne suivante jusqu'à ce qu'il tombe sur une composante.
    Voilà ma fonction:
    def f(image):
        import Image
        im=open(str(image),"r")
        matrice=im.readlines() # le module readlines va lire toutes les lignes composant l'image
        taille=len(matrice)    # Va calculer le nombre de lignes composant l'image
        dimension=matrice[2].split() # Supprime l'espace de la deuxième ligne. Cette ligne nous informe sur la largeur et la hauteur de l'image
        largeur=int(dimension[0]) # Prends en valeur la première valeur 
        hauteur=int(dimension[1]) # Prends en valeur la deuxième valeur 
        
    
    
        la_matrice=[[[0 for k in range(3)] for y in range(largeur)] for z in range(hauteur)]
        a=4
        for ligne in range(hauteur):
            for colonne in range(largeur):
                for k in range(3):
                    la_matrice[ligne][colonne][k]=int(matrice[a+k+3*(colonne+largeur*ligne)])
                   
        print la_matrice
    
    
    f("C:\Users\*****\Desktop\image.ppm")
    
    • Partager sur Facebook
    • Partager sur Twitter
      21 novembre 2010 à 0:36:04

      C'est assez simple en fait, quand tu insères tes lignes dans ta matrice, tu vérifies si la ligne ne commence pas par un #.

      for ligne in file.readlines():
          if not ligne.startswith('#'):
              matrice.append(ligne)
      
      • Partager sur Facebook
      • Partager sur Twitter
        21 novembre 2010 à 0:44:21

        Bonsoir, désolé, j'ai oublié de préciser que je ne pouvais pas utiliser ce genre de module, il faut créer un algorithme qui me permet de passer chaque ligne avec les '#' .

        Merci :)
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          21 novembre 2010 à 0:53:58

          Remplace "if not ligne.startswith('#'): " par "if not ligne[0] == '#': ".
          • Partager sur Facebook
          • Partager sur Twitter
            21 novembre 2010 à 1:16:38

            Bonsoir, merci de vos réponses. j'ai fait ce que vous m'avez dit, voilà mon code:
            def f(image):
                import Image
                im=open(str(image),"r")
                matrice=im.readlines() # le module readlines va lire toutes les lignes composant l'image
                taille=len(matrice)    # Va calculer le nombre de lignes composant l'image
                dimension=matrice[2].split() # Supprime l'espace de la deuxième ligne. Cette ligne nous informe sur la largeur et la hauteur de l'image
                largeur=int(dimension[0]) # Prends en valeur la première valeur 
                hauteur=int(dimension[1]) # Prends en valeur la deuxième valeur 
                print matrice
                
                
                la_matrice=[[[0 for k in range(3)] for y in range(largeur)] for z in range(hauteur)]
                a=4
                for ligne in matrice:
                    if not ligne[0]=='#':    ##### c'est ici que j'ai mis ce que vous m'avez dit
                        for ligne in range(hauteur):
                            for colonne in range(largeur):
                                for k in range(3):
                                    la_matrice[ligne][colonne][k]=int(matrice[a+k+3*(colonne+largeur*ligne)])
                    else:
                         ligne+=1
                print la_matrice
            
            
            f("C:\Users\****\Desktop\image.ppm")
            >>> la_matrice[ligne][colonne][k]=int(matrice[a+k+3*(colonne+largeur*ligne)])
            ValueError: invalid literal for int() with base 10: '# aaa\n'
            


            Voilà l'erreur que j'ai :(
            • Partager sur Facebook
            • Partager sur Twitter
              21 novembre 2010 à 2:47:18

              Il fallait modifier la boucle sur les lignes que tu as déjà, pas en rajouter une nouvelle par dessus.
              • Partager sur Facebook
              • Partager sur Twitter
                21 novembre 2010 à 10:20:51

                Bonjour,

                Citation : LeYan'tibus

                Remplace "if not ligne.startswith('#'): " par "if not ligne[0] == '#': ".

                Ça va planter si la ligne est vide (par exemple la dernière, qui est laissée vide par la plupart des éditeurs dignes de ce nom)

                Cordialement,
                ProgVal
                • Partager sur Facebook
                • Partager sur Twitter
                  21 novembre 2010 à 10:25:57

                  Une condition de ce genre là:
                  if len(ligne) > 0:
                  


                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    21 novembre 2010 à 11:50:35

                    if ligne and ligne[0] != '#':

                    Sinon, raizen414, tu ne récupère pas la valeur maximale des couleurs et tu ne gère que les fichiers avec chaque valeurs sur une ligne (en ASCII) alors quelle pourrait être seulement séparé par un espace ou autre caractère "blanc". (structure des fichiers PPM)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 novembre 2010 à 12:19:54

                      Bonjour, merci à tous de vos réponses.
                      Tout d'abord, vous me dites de modifier cette ligne
                      for ligne in range(hauteur
                      

                      par:
                      for ligne in matrice:
                      


                      Si je fais ça, la suite de mon code perd tout son sens...

                      LeYan'tibus, tu veux dire par là que mon code entier est faux ?


                      Merci

                      J'ai essayé de faire ce que vous m'avez dit, voilà ce que j'ai:
                      def f(image):
                          import Image
                          im=open(str(image),"r")
                          matrice=im.readlines() # le module readlines va lire toutes les lignes composant l'image
                          taille=len(matrice)    # Va calculer le nombre de lignes composant l'image
                          dimension=matrice[2].split() # Supprime l'espace de la deuxième ligne. Cette ligne nous informe sur la largeur et la hauteur de l'image
                          largeur=int(dimension[0]) # Prends en valeur la première valeur 
                          hauteur=int(dimension[1]) # Prends en valeur la deuxième valeur 
                          print matrice
                          
                          
                          la_matrice=[[[0 for k in range(3)] for y in range(largeur)] for z in range(hauteur)]
                          a=4
                          for ligne in matrice:
                              if not ligne[0]=='#' and len(ligne>0):       
                                      for colonne in range(largeur):
                                          for k in range(3):
                                              la_matrice[ligne][colonne][k]=int(matrice[a+k+3*(colonne+largeur*ligne)])
                      
                          print la_matrice
                      



                      et j'ai cette erreur :
                      Traceback (most recent call last):
                        File "C:\Users\****\Desktop\Test.py", line 23, in <module>
                          f("C:\Users\ ****\Desktop\image.ppm")
                        File "C:\Users\****\Desktop\Test.py", line 15, in f
                          if not ligne[0]=='#' and len(ligne>0):
                      TypeError: object of type 'bool' has no len()
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        21 novembre 2010 à 17:31:12

                        Recommençons du début, si tu le veux bien.

                        Un fichier PPM enregistré au format ASCII à un en-tête contenant dans l'ordre les 4 éléments suivant séparer par un caractère "BLANC" (' ', '\t', '\r', '\n' ):

                        1- le "TAG" qui permet de reconnaitre le fichier (ici il s'agira donc d'une chaine ASCII de 2 octets = P3;

                        2- la largeur;

                        3- la hauteur;

                        4- et enfin, ce que tu as oublié, la valeur maximal des intensités de couleurs.

                        De plus, on est d'accord qu'il est possible que des commentaires viennent au milieu de ces données. Donc, puisque tu lis ton fichier avec file.readlines() profites-en pour y supprimer tout de suite toutes les lignes de commentaires afin de ne plus t'en soucier après.

                        ;)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          21 novembre 2010 à 17:55:49

                          Citation : raizen414


                          et j'ai cette erreur :

                          Traceback (most recent call last):
                            File "C:\Users\****\Desktop\Test.py", line 23, in <module>
                              f("C:\Users\ ****\Desktop\image.ppm")
                            File "C:\Users\****\Desktop\Test.py", line 15, in f
                              if not ligne[0]=='#' and len(ligne>0):
                          TypeError: object of type 'bool' has no len()
                          

                          Bah forcément. Change ton len(ligne>0) en len(ligne) > 0
                          Mieux encore, tu peux juste mettre "ligne", étant donné qu'une chaine de caractères dont la longueur est supérieur à zéro renverra un booléen True :
                          • Partager sur Facebook
                          • Partager sur Twitter
                          yjltg.
                            21 novembre 2010 à 18:08:25

                            Bonjour, merci pour vos réponses.
                            LeYan: Oui, justement je essayais de trouver un code qui me permettrait de passer les dièses, mais j'avais pas regarder le problèmes de ton point de vue, c'est à dire justement supprimer ces dièses :p

                            'quelqun_d'autre': ok jvais voir ca

                            Merci de vos réponses, j'vais essayer de résoudre le problème :)



                            EDIT: Voilà ce que j'obtiens comme erreur
                            def f(image):
                                import Image
                                im=open(str(image),"r")
                                matrice=im.readlines() # le module readlines va lire toutes les lignes composant l'image
                                taille=len(matrice)    # Va calculer le nombre de lignes composant l'image
                                dimension=matrice[2].split() # Supprime l'espace de la deuxième ligne. Cette ligne nous informe sur la largeur et la hauteur de l'image
                                largeur=int(dimension[0]) # Prends en valeur la première valeur 
                                hauteur=int(dimension[1]) # Prends en valeur la deuxième valeur 
                                matrice.split('#')   ### la cça devrait me supprimer tous les dièses mais un message d'erreur s'affiche
                                
                                
                                la_matrice=[[[0 for k in range(3)] for y in range(largeur)] for z in range(hauteur)]
                                a=4
                                for ligne in range(hauteur):       
                                        for colonne in range(largeur):
                                            for k in range(3):
                                                la_matrice[ligne][colonne][k]=int(matrice[a+k+3*(colonne+largeur*ligne)])
                                                
                                print la_matrice
                            >>>Traceback (most recent call last):
                              File "C:\Users\****\Desktop\Test.py", line 21, in <module>
                                f("C:\Users\****\Desktop\image.ppm")
                              File "C:\Users\****\Desktop\Test.py", line 9, in f
                                matrice.split('#')
                            AttributeError: 'list' object has no attribute 'split'
                            
                            • Partager sur Facebook
                            • Partager sur Twitter
                              21 novembre 2010 à 18:56:43

                              Voilà, ce code là devrait fonctionner.

                              def f(image):
                                  import Image
                                  matrice = list()
                              
                                  # cette syntaxe permet d'ouvrir et de fermer le fichier automatiquement à la fin du bloc d'instruction
                                  with open(str(image), 'r') as img:
                              
                                      # parcourt des lignes du fichier img
                                      for ligne in img.readlines():
                                          # Si la ligne commence par un sharp,
                                          # alors c'est un commentaire et on ne l'ajoute pas à la matrice
                                          if ligne and not ligne[0] == '#':
                                              matrice.append(ligne)
                              
                              
                                  taille=len(matrice)    # Va calculer le nombre de lignes composant l'image
                                  dimension=matrice[2].split() # Supprime l'espace de la deuxième ligne. Cette ligne nous informe sur la largeur et la hauteur de l'image
                                  largeur=int(dimension[0]) # Prends en valeur la première valeur   // Vachement explicite tes commentaires dis donc !
                                  hauteur=int(dimension[1]) # Prends en valeur la deuxième valeur
                              
                              
                                  # Au lieu de mettre des commentaires au début, c'est plutôt sur l'algo ci-dessous que tu devrais mettre des commentaires
                                  la_matrice=[[[0 for k in range(3)] for y in range(largeur)] for z in range(hauteur)]
                                  a=4
                                  for ligne in range(hauteur):       
                                          for colonne in range(largeur):
                                              for k in range(3):
                                                  la_matrice[ligne][colonne][k]=int(matrice[a+k+3*(colonne+largeur*ligne)])
                                                  
                              print la_matrice
                              


                              PS: il aurait été cool que tu nous donnes le fichier Image.py et une image type.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                21 novembre 2010 à 19:11:11

                                Bonjour, merci de ta réponse.
                                J'ai un peu modifié ton code, mais un message d'erreur s'affiche.
                                Voilà mon code
                                def f(image):
                                    import Image
                                    img=open(str(image),"r")
                                    matrice = list()
                                    matrice=img.readlines() 
                                    dimension=matrice[2].split() # Supprime l'espace de la deuxième ligne. Cette ligne nous informe sur la largeur et la hauteur de l'image
                                    largeur=int(dimension[0]) # Prends en valeur la première valeur 
                                    hauteur=int(dimension[1])
                                
                                
                                        # parcourt des lignes du fichier img
                                    for ligne in img.readlines():
                                            # Si la ligne commence par un sharp,
                                            # alors c'est un commentaire et on ne l'ajoute pas à la matrice
                                        if ligne and not ligne[0] == '#':
                                            matrice.append(ligne)
                                
                                
                                    taille=len(matrice)    # Va calculer le nombre de lignes composant l'image
                                    dimension=matrice[2].split() # Supprime l'espace de la deuxième ligne. Cette ligne nous informe sur la largeur et la hauteur de l'image
                                    largeur=int(dimension[0]) # Prends en valeur la première valeur   // Vachement explicite tes commentaires dis donc !
                                    hauteur=int(dimension[1]) # Prends en valeur la deuxième valeur
                                
                                
                                    # Au lieu de mettre des commentaires au début, c'est plutôt sur l'algo ci-dessous que tu devrais mettre des commentaires
                                    la_matrice=[[[0 for k in range(3)] for y in range(largeur)] for z in range(hauteur)]
                                    a=4
                                    for ligne in range(hauteur):       
                                            for colonne in range(largeur):
                                                for k in range(3):
                                                    la_matrice[ligne][colonne][k]=int(matrice[a+k+3*(colonne+largeur*ligne)])
                                                    
                                    print la_matrice
                                
                                >>> Traceback (most recent call last):
                                  File "C:/Users/*****/Desktop/Ra.py", line 35, in <module>
                                    f("C:\Users\*****\Desktop\image.ppm")
                                  File "C:/Users/***/Desktop/Ra.py", line 31, in f
                                    la_matrice[ligne][colonne][k]=int(matrice[a+k+3*(colonne+largeur*ligne)])
                                ValueError: invalid literal for int() with base 10: '# ooofo\n'
                                



                                Je tiens à préciser que j'avais essayer de trouver un algorithme du même genre, mais ca me mettait ce message d'erreur aussi.

                                Dans l'erreur le '#ooofo' est un commentaire que j'ai placé dans une ligne de l'image pour vois si le code fonctionnait.

                                Voilà l'image ouvert avec un editeur de texte:
                                P3
                                # aaaaa
                                5 5
                                255
                                101
                                77
                                32
                                40
                                32
                                26
                                # ooofo
                                78
                                63
                                53
                                126
                                99
                                76
                                103
                                78
                                43
                                88
                                ...
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  21 novembre 2010 à 19:53:52

                                  raizen, débarasse toi des tes lignes 2 à 9 et mets-y simplement l'ouverture du fichier !

                                  Et puisqu'on en est à pondre du code maché-recraché voilà ce que je propose :

                                  def o_O(path):
                                      "Retourne l'en-tête et le corp du fichier PPM dans un tuple de liste."
                                      with open(path) as f:
                                          if f.read(2) != 'P3':
                                              raise IOError('"' + str(path) + '" n\' pas une fichier PPM valid !')
                                          data = f.readlines()
                                  
                                      head = []
                                      for line in data:
                                          if line[0] != '#':
                                              for el in line.split():
                                                  if not el.isnumeric():
                                                      raise IOError('"' + str(path) + '" est endommagé !')
                                                  head += [int(el)]
                                      data, head = head[3:], head[:3]
                                  
                                      body, line, pix, i = [], [], [data[0]], 1
                                      while i < len(data):
                                          if not i % 3:
                                              line += [pix]
                                              pix = []
                                  
                                          pix += [data[i]]
                                  
                                          if not i % (head[0] * 3):
                                              body += [line]
                                              line = []
                                          i += 1
                                  
                                      return head, body
                                  

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    21 novembre 2010 à 20:13:25

                                    Merci encore une fois de ta réponse :p.
                                    Désolé j'ai oublié de préciser que je ne pouvais pas utiliser des trucs du genre "with" "as" et autres module du genre :)
                                    Merci
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme
                                      21 novembre 2010 à 20:39:16

                                      Si tu ouvre ton fichier sans with alors pense à le refermer (c'est plus <italiqu>propre</italique>)

                                      >>> file = open(filename)
                                      >>> # ...
                                      >>> file.close()
                                      

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        21 novembre 2010 à 20:52:14

                                        Citation

                                        Désolé j'ai oublié de préciser que je ne pouvais pas utiliser des trucs du genre "with" "as" et autres module du genre



                                        Ce ne sont pas des modules!
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          21 novembre 2010 à 22:05:49

                                          C'est pour ça que j'ai mis "trucs" au début ^^
                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Aide pour enlever les "#"

                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                          • Editeur
                                          • Markdown