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 :

Alignement, ecriture dans fichier


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2013
    Messages : 23
    Par défaut Alignement, ecriture dans fichier
    Bonjour, pour un projet je dois aligner deux séquences entre elles mais il s'agit ici juste d'une facon esthetique de presenter l'alignement, et non pas d'un alignement local, global ou autre.

    J'ai écrit ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def pretty(file,idx,idy,s,x,y):
       f = open (file,"w")
       res = ""
       for x,y in zip (idx,idy):
          if x == y :
             res += x "/n" + "|" + "/n" y
          else:
             res += x "/n" + "-" + "/n" y
       f.close()
       return res
    Ma logique étant la suivante :
    on parcourt la sequence idx et la sequence idy en meme temps,
    si le caractere x de idx == le caractere y de idy alors on ecrit :
    x a la ligne, la barre, a la ligne y

    si x est different de y on ecrit :
    x a la ligne, tiret, y

    par exemple :
    idx = ATGA
    idy = ACGT
    pour le premier caractere de idx et idy on a x = A, y = A donc le resultat :
    A
    |
    A
    puis on continu et aboutit a :
    ATGA
    | - |-
    ACGT

    Mais ca ne fonctionne pas, je ne comprends pas pourquoi. Est ce ma logique qui est fausse ou alors mon code ?

    Merci.

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Par défaut
    Salut,
    Le problème vient que tu ajoutes les informations de 3 lignes dans une seule variable res. Il faut stocker le résultat de la comparaison dans une chaine, et une fois le traitement terminé, joindre les 3 chaines. Ce qui donne dans le même style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def match(str1, str2):
        res = list()
        for c1, c2 in zip(str1, str2):
            if c1 == c2:
                res.append("|")
            else:
                res.append("-")
        return "\n".join( [ str1, "".join(res), str2 ] )
    Ou avec une liste en intention :
    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
    from copy import copy
    from random import shuffle
     
    def match(str1, str2):
        res = [ "|" if c1 == c2 else "-" for c1, c2 in zip(str1, str2) ]
        return "\n".join( [ str1, "".join(res), str2 ] )
     
    def get_one(alpha = "ACGT"):
        ch = list(copy(alpha))
        shuffle(ch)
        return "".join(ch)
     
    def main():
        res = [ match(get_one(), get_one()) for _ in range(4) ]
        print( "\n".join(res) )
     
    if __name__ == '__main__':
        main()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> 
    AGCT
    -||-
    TGCA
    TAGC
    -|-|
    GATC
    AGCT
    ----
    GTAC
    TGAC
    ---|
    ATGC

  3. #3
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Un oubli peut-être ?
    faut pas bosser le week-end, c'est fait pour se reposer.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par chlowecita Voir le message
    Mais ca ne fonctionne pas, je ne comprends pas pourquoi. Est ce ma logique qui est fausse ou alors mon code ?
    C'est quoi ce charabia?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           res += x "/n" + "|" + "/n" y
    Vous pourriez tester un peu sous la console "avant":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> res = ''; x = 'A'; y = 'A'
    >>> res += x "/n" + "|" + "/n" y
      File "<stdin>", line 1
        res += x "/n" + "|" + "/n" y
                    ^                
    SyntaxError: invalid syntax
    Pour faire ce que vous dites:
    si le caractere x de idx == le caractere y de idy alors on ecrit :
    x a la ligne, la barre, a la ligne y
    >>> res += x + '\n|\n' + y donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> res
    'A\n|\nA'
    >>> print (res)
    A
    |
    A
    >>>
    Mais ça ne va pas permettre d’écrire les suivants "a la suite"!
    Le plus simple sera de remplir line1, line2, line3 auxquelles on ajoute a chaque itération:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> line1 += x
    >>> line2 += '|'
    >>> line3 += y
    Et bien, comme l'a fait remarquer VinsS, ne pas oublier de l’écrire dans le fichier "en sortie de boucle".

    Mais avant de faire de la chose une fonction qui écrive dans un fichier, vous testez "a la console":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> idx = 'ATGA'
    >>> idy = 'ACGT'
    >>> line1 = ''
    >>> line2 = ''
    >>> line3 = ''
    >>> for x, y in zip(idx, idy):
    ...    # a vous de jouer 
    ...
    >>> for e in line1, line2, line3:
    ...    print(e)
    La solution de _dardanos_ très bien.
    C'est ce que vous serez capable d’écrire lorsque vous aurez acquis des bases.
    C'est passer pas mal de temps a faire des essais/erreurs a pianoter a la console pour comprendre et apprendre.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2013
    Messages : 23
    Par défaut
    Tout d'abord merci à tous.
    En lisant vos commentaire je suis arrivée a ceci (d'abord en test dans ma console avant la version "definitive" avec l'ecriture dans le fichier)

    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
     
    def pretty(idx,idy,x,y):
       l1 = []
       l2 = []
       l3 = []
       for x,y in zip (idx,idy):
          if x == y:
              l1.append(x)
              l2.append('|')
              l3.append(y)
          else:
              l1.append(x)
              l2.append('-')
              l3.append(y)
        for e in l1,l2,l3:
            print "".join(e)
    mais quand je veux faire un test, exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pretty("ATA","AGA",x,y)
    ca me renvoie un message d'erreur : x is not defined si c'etait le cas ca devrait aussi me dire ca pour y. Je suis perdue.

  6. #6
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Avant de voir pour ton erreur, il faudrait que tu clarifies ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def pretty(idx,idy,x,y):
       ...
       for x,y in zip (idx,idy):
    Pourquoi utilises-tu les même noms x et y si ceux-ci sont déjà les noms de deux arguments.
    Quels sont ces arguments ? Ils ont l'air inutile, si c'est le cas, supprime les.

    Pour ton erreur, montre nous le traceback complet, je n'ai pas l'impression que cela vient de la portion de code que tu nous montre. Vérifie le numéro de ligne où l'erreur est levée.

  7. #7
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2013
    Messages : 23
    Par défaut
    Salut,

    J'y ai passée une partie de la nuit, car novice, mais j'ai compris d'ou venait mon erreur. J'ai modifié mon code et j'aboutit à :

    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
     
    def pretty(idx,idy,s,x,y): #avec : idx et idy = identifiant des sequences, s : score, x et y les deux sequences
       l1 = ["> "+ idx + " VS " + idy + ": " + str(s)]
       l2 = []
       l3 = []
       l4 = []
       i = 0 #j'initialise un compteur car dans un soucis d'esthetique une fois que j'aurai aligne x et y sur un longueur de 80 lettres, il faut sauter une ligne
       if i <= 80
           for a,b in zip (x,y):
                if a ==b:
                     l2.append(a)
                     l3.append ("|")
                     l4.append(b)
                 else:
                     l2.append(a)
                     l3.append("-")
                     l4.append(b)
     
         else:
             print '/n'
             for a,b in zip (x,y):
                 if a ==b:
                      l2.append(a)
                      l3.append("|")
                      l4.append(b)
                  else:
                      l2.append(a)
                      l3.append("-")
                      l4.append(b)
        i += 1
        for e in l1,l2,l3,l4:
             print "".join(e)
    Tout d'abord quand je me passe de ce soucis esthetique tout fonctionne très bien. Apres j'ai cru que je ne plaçais pas mon i += 1 au bon endroit, j'ai essaye de le change de place mais ca ne change rien je n'ai toujours pas le resultat escompté.
    J'ai essayé avec un while, mais je ne le maitrise pas tres bien et je me retrouvais avec des boucles infinies.
    Je suis sure en plus qu'il y a moyen de simplifier le code quand i> 80 pour ne pas avoir a tout reecrire. J'ai essayé d'en faire une fonction récursive mais j'ai de nouveau ma ligne 1 qui s'afficherait et ce n'est pas ce que je veux.
    Voila.

  8. #8
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Il manque le double-point à la ligne if i <= 80

    Le else: de la ligne 19 est incorrectement indenté, est-ce qu'il se rapporte à if i <= 80 auquel cas la ligne i += 1 n'est pas à sa place et si ce else: se rapporte à if a ==b: elle n'est pas indentée correctement.

    Je ne comprend pas cette question de 80 caractères, si je comprend bien ce qui à été dit plus haut, une ligne aura autant de caractères que le nombre d'items de la séquence x (ou y), non ?

Discussions similaires

  1. Obtenir les droits d'ecriture dans fichiers et base de registre
    Par Sunchaser dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 17/07/2006, 11h33
  2. [VB.NET]Ecriture dans fichier
    Par mhamdi45 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 03/07/2006, 10h20
  3. [Fortran 90] Ecriture dans fichier
    Par panda31 dans le forum Fortran
    Réponses: 9
    Dernier message: 12/06/2006, 16h53
  4. ecriture dans fichier par ma methode print
    Par makohsarah dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 17/05/2006, 19h26
  5. Écriture dans fichier PDF
    Par clairette dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 12/05/2006, 16h52

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