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 lignes précises d'un fichier texte


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2018
    Messages : 2
    Par défaut Supprimer lignes précises d'un fichier texte
    Bonjour à tous,

    Je vous présente mon problème. J'ai un fichier texte d'une longueur et d'un contenu variable. Il contient des white lists et des blacks lists.
    J'aimerai effectuer un nettoyage régulier d'une black list nommée "Black_List_Temp".
    Le fichier texte se présente comme cela:

    Black_List_1

    site a
    site b
    site c
    [...]

    end

    Black_List_2
    [...]

    Le titre des listes lui ne change pas. Voici les embryons de code que j'ai déjà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    import linecache
    import itertools    #j'ai essayé d'utiliser la fonction islice mais sans succès
     
    chaine = "Black_List_Temp"
    fichier = open("pi.txt", "r+")
     
    for ligne in fichier:
            i = i + 1   #récupère le numéro de ligne du début de la liste
            if chaine in ligne:
    Comme vous avez dû le voir ce langage ne m'est pas très familier...

    Merci d'avance de votre aide!

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 065
    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 065
    Par défaut
    Sur le principe, supprimer une ligne dans un fichier revient à créer un nouvelle chaîne de caractères que tu vas concaténer avec les lignes nécessaires de ton fichier.

    Une fois cette chaîne créée, tu effaceras ce fichier pour en recréer un autre, et tu écriras cette chaîne dedans.

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2018
    Messages : 2
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Sur le principe, supprimer une ligne dans un fichier revient à créer un nouvelle chaîne de caractères que tu vas concaténer avec les lignes nécessaires de ton fichier.

    Une fois cette chaîne créée, tu effaceras ce fichier pour en recréer un autre, et tu écriras cette chaîne dedans.
    Bonjour à toi et merci de ta réponse!

    Effectivement dans mes recherches j'ai cru comprendre que la suppression passait par la réécriture.
    Ce qui me pose le plus problème en réalité c'est la façon de "sélectionner" la plage concernée.
    Exemple, si le titre "Black_List_Temp" est détecté à la 100ème ligne.
    Alors il faut que je supprime (remplace) les lignes en partant de 102 jusqu'à la prochaine ligne vide (car la fin d'une liste avant le "End" est une ligne vide).

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 759
    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 759
    Par défaut
    Citation Envoyé par Famewarz Voir le message
    Alors il faut que je supprime (remplace) les lignes en partant de 102 jusqu'à la prochaine ligne vide (car la fin d'une liste avant le "End" est une ligne vide).
    Imaginez une liste comme [1, 0, 0, 99, 2, 0, 99, 1, 0, 99, 2, 0, 0, 99, 4, 0, 99 ] et avoir à créer une nouvelle liste en y supprimant les séquences 2,...,99 de la première.
    Vous allez faire une boucle sur l'ensemble des éléments.
    Dans la boucle tant que l'élément ne vaut pas "2" vous allez pouvoir l'ajouter à la nouvelle liste.
    A l'itération suivante, il va falloir se rappeler qu'on a vu "2" pour ignorer l'élément jusqu'à ce qu'on rencontre "99".
    "se rappeler" c'est via une variable qui passera de 1 à 0 puis de 0 a 1 (ou le contraire) pour contrôler l'ajout de l'élément à la nouvelle liste.

    notez que tout çà est ce qu'on apprend en faisant les exercices de tous les bons tutos.

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

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 22
    Par défaut
    il faut que tu split(n) ton texte pour créer des lignes, split crée une liste (ici de ligne)

    en suite tu itères sur chaque ligne avec un filtre booléen (si vrai, si faux)

    a chaque test, soit la ligne itérée est enregistrée dans une nouvelle liste, soit rejetée (pass(ne fait rien))

    ta seconde liste est donc pleine des lignes qui ne seront pas rejetée

    reste à toi de trouver le ou les filtres à appliquer lors de l'itération pour prendre(append) ou rejeter(pass) chaque ligne de la liste originelle

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 065
    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 065
    Par défaut
    Eh bien il a apparemment un flag qui lui permet de détecter les blocs, il faudra en tenir compte...

    Voilà un exemple rapide,

    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
    with open('test.txt') as f:
        flag = False
        text = []
        for line in f:
            new_line = line.rstrip()
            if new_line == 'Black_List_temp':
                flag = True
            elif flag and new_line == 'end':
                flag = False
            elif flag:
                continue
            else:
                text.append(line)
     
    with open('test.txt', 'w') as f:
        f.writelines(text)

Discussions similaires

  1. Supprimer une ligne précise d'un fichier texte.
    Par CLeBeR dans le forum VB.NET
    Réponses: 8
    Dernier message: 22/06/2012, 15h26
  2. Lire une ligne précise d'un fichier texte
    Par Junta dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 23/04/2009, 18h26
  3. Supprimer ligne blanche dans un fichier texte
    Par willytito dans le forum VBA Access
    Réponses: 4
    Dernier message: 02/11/2007, 15h52
  4. Réponses: 1
    Dernier message: 20/09/2007, 15h15
  5. Réponses: 2
    Dernier message: 18/05/2006, 13h38

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