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 :

Supprimer des lignes et garder d'autres d'un fichier texte


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2018
    Messages : 5
    Par défaut Supprimer des lignes et garder d'autres d'un fichier texte
    Bonjour tout le monde,

    Je vous prie de trouver le code que j'ai écris ainsi que son exécution, je voudrai affiner le résultat obtenu de la manière suivante:

    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
    data_EPG = {}
     
    ligne = data.split("\n")
     
    for i in filter(None, ligne):
        col = i.split(";")
        event = col[9]
     
        if   '//activate' in col[9]  or col[9]=='/app//standby' :
     
     
                data_EPG[event] = {
     
     
            '@mac':{
     
              col[6],
     
            },
     
     
            'Ev':{
     
              col[9],
     
            }
     
     
        }
     
                print(data_EPG[event]['Ev'] )
    Une parie du résultat obtenu résultat c'est:
    .
    .
    .
    {'/homepage//activate'}
    {'/epg//activate'}
    {'/homepage//activate'}
    {'/homepage//activate'}
    {'/canal//activate'}
    {'/homepage//activate'}
    {'/epg//activate'}
    {'/search//activate'}
    {'/live//activate'}
    {'/app//standby'}
    {'/live//activate'}
    {'/main_process//activate'}
    {'/app//standby'}
    {'/homepage//activate'}
    {'/epg//activate'}
    {'/app//standby'}


    Ce que je souhaite avoir en affinant mon code c'est d’éliminer tous les {'/xxx//activate'} tq: 'xxx'! = 'epg' et tous les {'/app//standby'} qui ne succèdent directement pas les {'/epg//activate'}. Donc le résultat que je souhaite avoir c'est le suivant:

    {'/epg//activate'}
    {'/homepage//activate'}
    {'/epg//activate'}
    {'/search//activate'}
    {'/epg//activate'}
    {'/app//standby'}

    Si vous avez une idée sur comment je peux avoir ce résultat en affinant mon code, svp aidez-moi. Merci d'avance !

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Jiji30 Voir le message
    et tous les {'/app//standby'} qui ne succèdent directement pas les {'/epg//activate'}

    Si vous avez une idée sur comment je peux avoir ce résultat en affinant mon code, svp aidez-moi. Merci d'avance !
    Bonjour

    Etant donné que tu traites les lignes une à une, tu ne peux à priori pas savoir si {'/app//standby'} succède ou ne succède pas un {'/epg//activate'}.
    Donc il faut que quand tu trouves un {'/epg//activate'} tu mets un flag à True. Si ensuite tu as {'/app//standby'} et que le flag est à True tu ne fais rien sinon tu le supprimes. Et dans tous les cas tu remets le flag à False.

    Et putain quand on voit ta façon de coder (tabulé n'importe comment, des lignes vides anarchiques) ben on n'a vraiment pas envie de s'impliquer plus.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2018
    Messages : 5
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Etant donné que tu traites les lignes une à une, tu ne peux à priori pas savoir si {'/app//standby'} succède ou ne succède pas un {'/epg//activate'}.
    Donc il faut que quand tu trouves un {'/epg//activate'} tu mets un flag à True. Si ensuite tu as {'/app//standby'} et que le flag est à True tu ne fais rien sinon tu le supprimes. Et dans tous les cas tu remets le flag à False.

    Et putain quand on voit ta façon de coder (tabulé n'importe comment, des lignes vides anarchiques) ben on n'a vraiment pas envie de s'impliquer plus.
    Merci beaucoup Mr. Sve@r pour ta réponse! J'ajoute juste que si le flag est à True et que sois j'ai {'/app//standby'} ou un {'/xxx//activate'} je ne fais rien sinon je les supprime.
    Un petit souci c'est que je n'ai jamais travaillé avec les flags avant , je serai reconnaissante si vous pouvez me montrer à quoi ressemblera mon code.

  4. #4
    Membre expérimenté Avatar de zancrows
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 159
    Par défaut
    Salut ce que veut dire Sve@r par flag, c'est juste une variable
    ex :

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Citation Envoyé par Jiji30 Voir le message
    je serai reconnaissante si vous pouvez me montrer à quoi ressemblera mon code.
    Oufff, à mon avis ça va saigner

    Citation Envoyé par Jiji30 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in filter(None, ligne):
    Pourquoi cette fonction filter si en premier argument tu ne mets pas de fonction ?

    Citation Envoyé par Jiji30 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne = data.split("\n")
    N'y a-t-il qu'une seule ligne dans le fichier ? Si oui le nom est bien choisi, si non...

    --------------------------------------

    Il y a un mélange d'anglais et de français dans le nom de tes variables, pas bien !

    Pour lire chaque ligne de ta variable data, on préfère

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for line in data:
        # suite du code
    Comme le dis Sve@r, le flag est la bonne manière en lisant ligne par ligne de la façon que je présente juste au-dessus, et le code ressemblera à (non testé évidemment) quelque chose comme ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for line in data:
        if flag:
            if line.startswith('/app//standby'): # Si la ligne commence par '/app//standby'
                # on agit
        flag = False
        if line.startswith('/epg//activate'):
            flag = True
        # etc
    --------------------------------------

    Autre manière de faire et de jouer avec les index d'une liste de lignes du fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    lines = data.splitlines()
    for ind, line in enumerate(lines):
        if line.startswith('/epg//activate'):
            if lines[ind+1].startswith('/app//standby'):
                # on agit
    Bref il y a du boulot et de bonnes bases à avoir avant d'attaquer cela sereinement...

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2018
    Messages : 5
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Oufff, à mon avis ça va saigner

    Pourquoi cette fonction filter si en premier argument tu ne mets pas de fonction ?

    N'y a-t-il qu'une seule ligne dans le fichier ? Si oui le nom est bien choisi, si non...

    --------------------------------------
    Il y a un mélange d'anglais et de français dans le nom de tes variables, pas bien !
    Merci Mr @fred1599 pour ta réponse ainsi que pour tes précieux conseils.
    En effet mon fichier texte comprend plusieurs lignes. J'ai utilisé la fonction filter car sinon j'avais un message d'erreur de 'Index out of range' puisque dans mon fichier texte entre une ligne et une autre il y avait juste un espace du coup j'ai été dans l'obligation de le filtrer.
    J'ajoute juste que mes lignes ne commencent pas par '/app//standby'.
    Voici le code que j'ai pu écrire en utilisants les flags et en se basant sur le votre :
    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
    data_EPG = {}
    lines = data.split("\n")
    for line in filter(None, lines):
        col = line.split(";")
        #print(col[9])
        event = col[9]
        if flag:
            if   '//activate' in col[9]   or col[9]=='/app//standby' :
                data_EPG[event] = {
            '@mac':{
              col[6],
            },
            'Ev':{  
              col[9],
            }
        }
        flag = False
        if col[9]== '/epg//activate':
            flag = True
        print(data_EPG[event] )
    Or je reçois l'erreur suivante:

    KeyError Traceback (most recent call last)
    <ipython-input-28-15974b8cf359> in <module>()
    18 if col[9]== '/epg//activate':
    19 flag = True
    ---> 20 print(data_EPG[event] )
    21
    22

    KeyError: '/app//wakeup'


    Sachant que '/app//wakeup' est la col[9] de la 1ère ligne de mon fichier texte.

    J'ai beau essayer de comprendre d’où ça vient cette erreur mais sans résultat . Si vous avez une idée, je vous prie de m'aider !

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Jiji30 Voir le message
    J'ai beau essayer de comprendre d’où ça vient cette erreur mais sans résultat . Si vous avez une idée, je vous prie de m'aider !
    M'étonne que wiztricks ne soit pas venu te dire qu'avant de coder il faut commencer par acquérir les bases (lire des tutos, faire les exercices, etc). Il doit être en vacances...

    Un "KeyError", comme sa traduction française le laisse suggérer, est une erreur de clef. Ca signifie que la clef que tu utilises n'existe pas dans ton tuple/liste/dictionnaire. Donc ici, ça veut dire qu'au moment où tu demandes data_EPG[event] ton dictionnaire "data_EPG" n'a pas de clef dont la valeur est dans la variable "event".

    Et pour arriver à comprendre le pourquoi d'une erreur, rien ne vaut le bon vieux print() des familles.

    PS: dans un forum oui les intervenants peuvent aider... mais ils ne peuvent pas apprendre les bases à ta place.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/07/2016, 15h21
  2. Supprimé des lignes d'un fichier contenu dans un autre fichier
    Par nekcorp dans le forum Général Python
    Réponses: 12
    Dernier message: 05/05/2014, 21h27
  3. Comment supprimer des lignes d'un fichier en fonction d'un autre fichier
    Par Ohemeg dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 21/04/2009, 13h56
  4. [VBA][Excel]supprimer des lignes vierges
    Par Angel79 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 17/01/2006, 13h17
  5. Shell pour supprimer des lignes d'un fichier
    Par nelsa dans le forum Autres langages
    Réponses: 2
    Dernier message: 20/09/2004, 12h26

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