183 votes

Comment supprimer une ligne spécifique dans un fichier ?

Disons que j'ai un fichier texte rempli de surnoms. Comment puis-je supprimer un pseudo spécifique de ce fichier, en utilisant Python ?

1 votes

Essayez fileinput comme décrit par @j-f-sebastian aquí . Il semble vous permettre de travailler ligne par ligne, via un fichier temporaire, le tout avec une simple for la syntaxe.

3voto

Deep Points 36

J'ai aimé l'approche fileinput telle qu'expliquée dans cette réponse : Suppression d'une ligne dans un fichier texte (python)

Disons par exemple que j'ai un fichier qui contient des lignes vides et que 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 une longueur de 1

3voto

Ren Points 1339

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  

Supprimez la première ligne :

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

puis

$ cat animal.txt
pig
cat
monkey
elephant

9 votes

Cette solution n'est pas agnostique au système d'exploitation, et puisque le PO n'a pas spécifié de système d'exploitation, il n'y a aucune raison de poster une réponse spécifique à Linux.

4 votes

Toute personne qui suggère d'utiliser subprocess pour quelque chose qui peut être fait avec juste python reçoit un downvote ! Et +1 à @SteinarLima... Je suis d'accord

0 votes

Le site -i est non standard, et fonctionne différemment sur les plateformes *BSD (y compris macOS) que sur Linux. L'option de Python fileinput fait la même chose de manière transparente, portative et native.

2voto

andrii1986 Points 33

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 qui readlines() ), j'utilise deux fichiers. L'un sert à contenir les données principales, et le second sert à 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 cela vous sera utile ! :)

2voto

A Malik Points 38

Je pense que si vous lisez le fichier dans une liste, puis faites le vous pouvez itérer sur la liste pour chercher le surnom dont vous voulez vous débarrasser. Vous pouvez le faire plus efficacement sans créer de fichiers supplémentaires, mais vous devrez réécrire le résultat dans le fichier source.

Voici comment je pourrais procéder :

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
...

Chargez ensuite le fichier dans la liste :

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

Ensuite, itérez sur 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, écrivez 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()

1voto

Ru887321 Points 171

J'aime cette méthode qui utilise fileinput et la méthode 'inplace' :

import fileinput
for line in fileinput.input(fname, inplace =1):
    line = line.strip()
    if not 'UnwantedWord' in line:
        print(line)

C'est un peu moins verbeux que les autres réponses et c'est assez rapide pour

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X