La suppression d'une ligne spécifique dans un fichier (python)

disons que j'ai un fichier texte plein de surnoms, comment puis-je supprimer une spécifique surnom de ce fichier?

92
demandé sur SourD 2011-01-17 07:38:55

13 réponses

si votre fichier est dans le format d'un surnom par ligne, utilisez ceci.

First, ouvrir le fichier:

f = open("yourfile.txt","r")

ensuite, récupérez toutes vos lignes du fichier:

lines = f.readlines()

Maintenant, vous pouvez fermer le fichier:

f.close()

et le rouvrir en mode écriture:

f = open("yourfile.txt","w")

alors, écrivez vos lignes en arrière, sauf la ligne que vous voulez supprimer. Vous pourriez vouloir changer le "\n" à la ligne que vous utilisez pour terminer votre fichier.

for line in lines:
  if line!="nickname_to_delete"+"\n":
    f.write(line)

à la fin, fermez à nouveau le fichier.

f.close()
144
répondu houbysoft 2011-01-17 04:59:35

Solution à ce problème avec une seule ouverture:

f = open("target.txt","r+")
d = f.readlines()
f.seek(0)
for i in d:
    if i != "line you want to remove...":
        f.write(i)
f.truncate()
f.close()

cette solution ouvre le fichier en mode R/w ("r+") et utilise seek pour réinitialiser le pointeur f puis tronquer pour tout supprimer après la dernière écriture.

70
répondu Lother 2015-01-21 00:42:08

la meilleure option et la plus rapide, plutôt que de tout stocker dans une liste et de rouvrir le fichier pour l'écrire, est à mon avis de réécrire le fichier ailleurs.

with open("yourfile.txt","r") as input:
    with open("newfile.txt","wb") as output: 
        for line in input:
            if line!="nickname_to_delete"+"\n":
                output.write(line)

C'est ça! En une seule boucle, vous pouvez faire la même chose. Il sera beaucoup plus rapide.

17
répondu Barnabe 2014-11-21 22:05:55

C'est une" fourchette "de @Lother 'S réponse (qui je crois que cela devrait être considéré comme la bonne réponse).



Pour un fichier comme celui-ci:

$ cat file.txt 
1: october rust
2: november rain
3: december snow

cette fourchette de la solution de Lother fonctionne bien:

#!/usr/bin/python3.4

with open("file.txt","r+") as f:
    new_f = f.readlines()
    f.seek(0)
    for line in new_f:
        if "snow" not in line:
            f.write(line)
    f.truncate()

améliorations:

  • with open , qui écarte l'usage de f.close()
  • plus plus clair if/else pour évaluer si la chaîne n'est pas présente dans la ligne
9
répondu ivanleoncz 2018-04-26 17:50:46

le problème avec la lecture des lignes dans la première passe et les modifications (suppression de lignes spécifiques) dans la deuxième passe est que si vous avez des tailles de fichiers énormes, vous n'aurez plus de mémoire vive. Au lieu de cela, une meilleure approche est de lire les lignes, une par une, et de les écrire dans un fichier séparé, en éliminant ceux dont vous n'avez pas besoin. J'ai lancé cette approche avec des fichiers aussi gros que 12-50 Go, et L'utilisation de la RAM reste presque constante. Seuls les cycles CPU montrent un traitement en cours.

4
répondu Kingz 2013-11-06 22:03:37

si vous utilisez Linux, vous pouvez essayer l'approche suivante.

Supposons que vous ayez un fichier texte nommé animal.txt :

$ cat animal.txt  
dog
pig
cat 
monkey         
elephant  

supprimer la première ligne:

>>> import subprocess
>>> subprocess.call(['sed','-i','/.*dog.*/d','animal.txt']) 

puis

$ cat animal.txt
pig
cat
monkey
elephant
4
répondu Ren 2016-04-07 11:53:46

je pense que si vous lisez le fichier dans une liste, puis vous pouvez parcourir la liste pour rechercher le pseudo que vous voulez vous débarrasser de. Vous pouvez le faire de manière efficace sans créer de fichiers supplémentaires, mais vous devrez écrire le résultat dans le fichier source.

Voici comment je pourrais faire ceci:

import, os, csv # and other imports you need
nicknames_to_delete = ['Nick', 'Stephen', 'Mark']

je suppose que nicknames.csv contient des données comme:

Nick
Maria
James
Chris
Mario
Stephen
Isabella
Ahmed
Julia
Mark
...

Puis charger le fichier dans la liste:

 nicknames = None
 with open("nicknames.csv") as sourceFile:
     nicknames = sourceFile.read().splitlines()

ensuite, passez à la liste pour faire correspondre vos entrées à supprimer:

for nick in nicknames_to_delete:
     try:
         if nick in nicknames:
             nicknames.pop(nicknames.index(nick))
         else:
             print(nick + " is not found in the file")
     except ValueError:
         pass

Enfin, écrire le résultat dans le fichier:

with open("nicknames.csv", "a") as nicknamesFile:
    nicknamesFile.seek(0)
    nicknamesFile.truncate()
    nicknamesWriter = csv.writer(nicknamesFile)
    for name in nicknames:
        nicknamesWriter.writeRow([str(name)])
nicknamesFile.close()
2
répondu A Malik 2016-04-24 18:52:31

pas une bonne solution si vous mettez un fichier entier en mémoire, je sais que de nos jours tout le monde a des tonnes de mémoire, mais considérez si le fichier est plusieurs Go de journaux ou quelque chose.

mieux vaut le copier ligne par ligne dans un nouveau fichier, que supprimer la première ou quelque chose comme ça

2
répondu user3063349 2016-12-22 15:32:18

en général, vous ne pouvez pas; vous devez écrire à nouveau le dossier entier (au moins du point de changement à la fin).

Dans certains cas, vous pouvez faire mieux que cela -

si tous vos éléments de données sont de même longueur et sans ordre précis, et que vous connaissez le décalage de celui dont vous voulez vous débarrasser, vous pouvez copier le dernier élément sur celui à supprimer et tronquer le fichier avant le dernier élément;

ou vous pourrait juste écraser le morceau de données avec un' ce sont de mauvaises données, sautez-le 'valeur ou gardez un' cet élément a été supprimé ' drapeau dans vos éléments de données enregistrés de sorte que vous pouvez marquer qu'il a été supprimé sans modifier le fichier.

c'est sans doute exagéré pour des documents courts (moins de 100 Ko?).

1
répondu Hugh Bothwell 2011-01-17 05:55:48

j'ai aimé l'approche fileinput comme expliqué dans cette réponse: supprimer une ligne d'un fichier texte (python)

dire par exemple que j'ai un fichier qui a des lignes vides et je veux supprimer les lignes vides, voici comment je l'ai résolu:

import fileinput
import sys
for line_number, line in enumerate(fileinput.input('file1.txt', inplace=1)):
    if len(line) > 1:
            sys.stdout.write(line)

Note: les lignes vides dans mon cas avaient la longueur 1

1
répondu Deep 2015-01-13 10:58:29

Probablement, vous avez déjà une réponse correcte, mais voici la mienne. Au lieu d'utiliser une liste pour collecter des données non filtrées (ce que fait la méthode readlines() ), j'utilise deux fichiers. L'une est pour hold a main data, et la seconde est pour filtrer les données lorsque vous supprimez une chaîne spécifique. Voici un code:

main_file = open('data_base.txt').read()    # your main dataBase file
filter_file = open('filter_base.txt', 'w')
filter_file.write(main_file)
filter_file.close()
main_file = open('data_base.txt', 'w')
for line in open('filter_base'):
    if 'your data to delete' not in line:    # remove a specific string
        main_file.write(line)                # put all strings back to your db except deleted
    else: pass
main_file.close()

J'espère que vous trouverez cela utile! :)

0
répondu andrii1986 2015-11-25 07:55:57

enregistrer les lignes du fichier dans une liste, puis Supprimer de la liste la ligne que vous voulez supprimer et écrire les lignes restantes dans un nouveau fichier

with open("file_name.txt", "r") as f:
    lines = f.readlines() 
    lines.remove("Line you want to delete\n")
    with open("new_file.txt", "w") as new_f:
        for line in lines:        
            new_f.write(line)
0
répondu Henrique Andrade 2017-02-20 02:36:58

prend le contenu du fichier, le divise par newline en un tuple. Ensuite, accédez au numéro de ligne de votre tuple, rejoignez votre résultat et réécrivez le fichier.

-1
répondu Nikhil 2011-01-17 04:40:52