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 :

suppression caracteres dans une ligne


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 70
    Par défaut suppression caracteres dans une ligne
    Bonjour, bonjour,

    Je suis plutot debutant en python et j'ai un pitit probleme (d'ou ma venue ici) ...
    Voila je recherche a faire une fonction qui lit un fichier, regarde si il est vide (sachant qu'il ya obligatoirement une entete donc qui regarde si après l'entete le fichier est vide ou pas) et qui suivant ce que donne la fonction lecture de fichier supprime dans une liste des caracteres correspondant au fichier vide.
    Je m'explique plus en detail :
    J'ai plusieurs fichiers tabulés (.tsv) de la forme suivante :
    # blabla les # blabla sont les entetes du fichiers elles sont générées automatiquement
    # blabla
    # blabla
    donnée 1
    donnée 2
    ...

    Si le fichier est vide, on n'a que l'ente donc les # blabla

    J'ai donc crée la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for fichier in Listefichier:
         f = open('fichier.tsv',"r")
         ligne = f.readline()
         while ligne[0] = "#":
               ligne = f.readline()
         if ligne[0] = "":
               f.close()
               os.remove('fichier.tsv')
    (Haaaaaan pas d'indentation cay le maaaaaaaaaaaal mais je n'ai pas encore écrit la fonction donc pas de fichier a rattacher avec indentations ... 1000 excuses!)

    Ensuite, je regarde si le fichier existe dans mon repertoire ou pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for fichier in Listefichier:
          if os.path.isfile('fichier.tsv') == False
    Et ici, je voudrais que si le fichier n'existe pas, sachant que j'ai une liste de parametres a mettre en argument a un fichier batch, bah le parametre associé a ces fichiers qui n'existent plus (parcequ'ils étaient vides et que je les ai supprimés) soient supprimer de ma chaine de caractere.

    Exemple : J'ai 3 fichiers LOL_MDR.tsv, LOL_PTDR.tsv, LOL_XPLDR.tsv
    il s'avère que LOL_MDR.tsv est vide (juste l'entete) donc la premiere fonction le supprimme. J'ai ma chaine de caractere que je voudrais donner en argument a mon .bat qui est la suivante : %MDR% %PTDR% %XPLDR%
    Je voudrais que si os.path.isfile('LOL_MDR.tsv') == FALSE ma chaine de caractere devienne %PTDR% %XPLDR%.

    Est-ce que vous auriez une idée de comment faire ça?
    Et bien sur.... Si une erreur dans la premiere partie de mon code vous saute aux yeux (je rappele que je débute ... ne me jettez pas la pierre NOOOOOOOOON!! Aïe !) faites moi le savoir SVP !

    En tout cas, je vous remercie de votre attention et vous souhaite une bonne journée !

    Amicalement,
    Tequila PAF !

  2. #2
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Salut,

    Ensuite, je regarde si le fichier existe dans mon repertoire ou pas :
    Code :

    for fichier in Listefichier:
    if os.path.isfile('fichier.tsv') == False
    Si déjà auparavant tu as lu ton fichier, tu n'as pas besoin de vérifier qu'il existe

    Ensuite un conseil, donnes à tes fichiers le nom exact des parties de texte à supprimer. Puis, plutôt que de supprimer des caractères d'une chaîne si certain fichiers sont vide, pourquoi ne pas plutôt ajouter des caractères si les fichiers sont pleins (enfin... c'est peut-être juste une question de point de vue)

    Bon, désolé de te le dire, mais comme ton message n'est pas très clair, voici le code que je te propose (d'après mon interprétation de ton texte):
    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
    def isEmpty(filename):
        f_in=open(filename,'r')
        while 1:
            line=f_in.readline().strip()
            if line:
                if line[0]!='#':
                    res=False
                    break
            else:
                res=True
                break
        return res
     
    batInstruction='myCommand '
    for filename in os.listdir('./MyFolder'):
        if os.isfile('./MyFolder/'+filename) and not isEmpty('./MyFolder/'+filename):
            batInstruction+='%%s%'%filename.upper().split('.')[0]

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 70
    Par défaut
    Salutation !

    Tout d'abord merci d'avoir pris le temps de me repondre !

    Citation Envoyé par N.tox Voir le message
    Si déjà auparavant tu as lu ton fichier, tu n'as pas besoin de vérifier qu'il existe
    Alors ça c'est pas faux!
    Mais l'idée de base était de supprimer mon fichier si il est vide et ensuite j'ai voulu rajouter une fonction donc ... bah copié-collé sans trop réfléchir.
    Merci pour ce point déjà !

    Citation Envoyé par N.tox Voir le message
    Ensuite un conseil, donnes à tes fichiers le nom exact des parties de texte à supprimer. Puis, plutôt que de supprimer des caractères d'une chaîne si certain fichiers sont vide, pourquoi ne pas plutôt ajouter des caractères si les fichiers sont pleins (enfin... c'est peut-être juste une question de point de vue)
    Comme je peux etre couillon parfois.... C'est une solution beaucoup plus simple.

    Sinon pour ce qui est de ton code, mon appel de fichier .bat est faite plus tard et je ne l'ai pas mis dans le code... De cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    commande= '"'+self.nom_fichier_bat+'" "'+self.repertoire_tsv+'" "'+parametre_lancement_plotteur'"
    a = subprocess.call(commande, shell=False)
    Ou parametre_lancement_plotteur est la fameuse chaine de caractere que je met en argument au lancement du batch et qui est utilisé ensuite dans l'appel d'un plotteur (argument du plotteur ce sont en fait les variables a extraire et a plotter)

    Donc voila... Tu m'as bien débloqué en tout cas ! Je vais essayer de faire fonctionner tout ça et pis bah je viendrais ici crier ma joie ! (ou pas).

    Merci beaucoup NTox

  4. #4
    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
    Bienvenue.

    Bon.
    Si le problème est juste d'obtenir une chaine '%PTDR% %XPLDR%' à partir d'une chaine '%MDR% %PTDR% %XPLDR%'
    sachant qu'on veut éliminer aelim = 'MDR', il suffit de faire

    ch = '%MDR% %PTDR% %XPLDR%'.replace(motif,"")

    "" entourent une position sans caractère
    motif peut être obtenu de plusieurs façons

    motif = '%' + aelim + '%'
    motif = '%%s%' % aelim
    motif = aelim.join('%','%')

    et d'autres façons encore certainement.
    Il y a des différences entre les diverses possibilités qu'offre Python, il faut les connaître pour bien chosir. Par exemple la méthode join() est préférable à l'utilisation de + :
    cf 'Construction de chaînes de caractères' dans
    http://www.biologeek.com/bonnes-prat...stuces-python/


    Nota: le % dans %s et % n'ont rien à voir avec les % dans ta chaine, c'est une notation de formatage de chaine Python.


    Mais on peut voir plus loin et se dire que tu vas sans doute avoir besoin d'éliminer plusieurs noms d'une chaine: dans ce cas replace() n'est pas très pratique car, à ma connaissance, elle ne permet pas de remplacer plusieurs motifs différents par un même motif de remplacement (qui serait pour toi "").
    Donc on peut commencer à chercher une façon plus sophistiquée qui évitera de faire une itération dans une liste des noms à éliminer.
    Là aussi, il y a plusieurs façons de faire. Le choix dépend du goût de chacun, de son niveau et SURTOUT de ce qui est en AMONT. Personnellement, je m'efforce de faire des choix de traitement en un endroit du code en pensant déjà aux traitements qui seront faits à l'aval.
    Il y a par exemple les deux possibilités suivantes (passage par listes ou par ensembles) parmi lesquelles il faut choisir en fonction des facilités que donne l'une ou l'autre en amont.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ch1 = '%MDR% %PTDR% %XPLDR% %BENALOR% %VOUAI% %ZUI% %PLOP%'
    print 'ch1 = '+ch1
    print
    liaelim = ['%PTDR%','%BENALOR%','%PLOP%']
    print 'liaelim = ',liaelim
    lo = ch1.split()
    print 'liste avant elimination =',lo
    [lo.remove(u) for u in lo if u in liaelim]
    print 'liste apres elimination =',lo
    print
    ch2 = ' '.join(lo)
    print 'ch2 = '+ch2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ch1 = '%MDR% %PTDR% %XPLDR% %BENALOR% %VOUAI% %ZUI% %PLOP%'
    print 'ch1 = '+ch1
    print
    liaelim = ['%PTDR%','%BENALOR%','%PLOP%']
    print 'liaelim = ',liaelim
    ensemble1 = set(ch1.split())
    print 'ensemble1 avant elimination =',ensemble1
    ensemble1.difference_update(set(liaelim))
    print 'ensemble1 apres elimination =',ensemble1
    print
    ch2 = ' '.join(ensemble1)
    print 'ch2 = '+ch2

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. nombres caracteres dans une ligne d'un fichier
    Par small44 dans le forum Débuter
    Réponses: 3
    Dernier message: 08/02/2014, 14h59
  2. supprimer une chaine de caractere dans une ligne.
    Par wadabush dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 11/02/2009, 20h59
  3. AWK suppression d'espace dans une ligne
    Par falcon dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 16/07/2008, 09h52
  4. suppression "parfaite" d'une ligne dans Tstringlist
    Par potili2 dans le forum Delphi
    Réponses: 2
    Dernier message: 08/03/2007, 12h05
  5. Remplacement de caracteres dans une ligne
    Par tibyann dans le forum Linux
    Réponses: 10
    Dernier message: 14/02/2006, 12h12

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