Python >> Tutoriel Python >  >> Python

Comment rechercher et remplacer une ligne dans un fichier en Python ? 5 façons simples

Problème : Étant donné le contenu d'un fichier texte. Comment rechercher et remplacer une chaîne ou une ligne spécifique dans le fichier ?

Exemple : Considérons l'exemple suivant où vous souhaitez remplacer le surligné (gras ) parties de texte.

Texte dans le fichier avant de remplacer une ligne :

There was an idea to bring together a group of remarkable people to see if we could become something more. This line explains the idea behind the Avengers Initiative and what the Avengers were meant to be.

Texte dans le fichier après remplacement d'une ligne :

There was an idea to bring together a group of remarkable people to see if we could become something more. This line explains the idea behind the Finxters Initiative and what the Finxters were meant to be.

Solution :

Dans nos solutions, le fichier pris en considération est nommé demo.txt , et le chemin a été mentionné comme chemin dans mon système local. Lorsque vous utilisez le code dans votre programme, veuillez les remplacer en conséquence.

Méthode 1 :boucler sur chaque ligne et utiliser la méthode string.replace()

Le moyen le plus simple de remplacer une ligne spécifique dans un fichier est de parcourir chaque ligne du fichier texte et de trouver le texte/la chaîne à remplacer, puis de le remplacer par la nouvelle chaîne en utilisant le replace() méthode.

Ceci est démontré dans l'extrait suivant donné ci-dessous (veuillez suivre les commentaires pour une meilleure prise en main du code) :

#open file in read mode
file = open("demo.txt", "r")
replaced_content = ""

#looping through the file
for line in file:
    
    #stripping line break
    line = line.strip()

    #replacing the texts
    new_line = line.replace("Avengers", "Finxters")

    #concatenate the new string and add an end-line break
    replaced_content = replaced_content + new_line + "\n"

    
#close the file
file.close()

#Open file in write mode
write_file = open("demo.txt", "w")

#overwriting the old file contents with the new/replaced content
write_file.write(replaced_content)

#close the file
write_file.close()

Méthode 2 :Lire et écraser l'intégralité du fichier d'un coup

L'approche suivante est un moyen rapide de remplacer du texte arbitraire (par exemple, une ligne spécifique) dans un fichier :

Pour remplacer une chaîne arbitraire (telle qu'une ligne spécifique) dans un fichier Python, suivez les trois étapes suivantes :

  1. Ouvrir le fichier en mode lecture en utilisant open('demo.txt', 'r') et lire tout le contenu du fichier en utilisant file.read() .
  2. Créer une nouvelle chaîne avec le contenu remplacé en utilisant le string.replace(old, new) méthode.
  3. Ouvrir le fichier en mode écriture avec open('demo.txt', 'w') et remplacez-le par le nouveau content en utilisant file.write(content) .

Voici un extrait qui applique cette méthode à notre exemple de code en cours d'exécution :

# Read file in read mode 'r'
with open('demo.txt', 'r') as file:
  content = file.read()

# Replace string
content = content.replace('Avengers', 'Finxters')

# Write new content in write mode 'w'
with open('demo.txt', 'w') as file:
  file.write(content)

Le problème avec cette approche est que la lecture de l'intégralité du fichier peut prendre beaucoup de temps s'il est trop volumineux pour la mémoire de votre ordinateur. De plus, vous ne pouvez pas remplacer un numéro de ligne spécifique comme cela peut être fait dans la boucle for de la Méthode 1 .

Cependant, c'est un moyen rapide de résoudre le problème pour les fichiers plus petits.

Méthode 3 :boucler sur chaque ligne et utiliser la méthode string.replace()

Si vous souhaitez remplacer un numéro de ligne spécifique, vous pouvez utiliser une variante de la Méthode 1 .

Pour remplacer un numéro de ligne spécifique dans un fichier, parcourez chaque ligne du fichier texte et recherchez le numéro de ligne à remplacer, puis remplacez-le par la nouvelle chaîne en utilisant le replace() méthode.

Ceci est démontré dans l'extrait suivant donné ci-dessous :

# open file in read mode
file = open("demo.txt", "r")
replaced_content = ""
line_number = 3
i = 0

# looping through the file
for line in file:
    
    # stripping line break
    line = line.strip()

    # replacing the text if the line number is reached
    if i == line_number:
        new_line = line.replace("Avengers", "Finxters")
    else:
        new_line = line

    # concatenate the new string and add an end-line break
    replaced_content = replaced_content + new_line + "\n"

    # Increase loop counter
    i = i + 1

    
# close the file
file.close()

# Open file in write mode
write_file = open("demo.txt", "w")

# overwriting the old file contents with the new/replaced content
write_file.write(replaced_content)

# close the file
write_file.close()

Méthode 3 :écrivez le contenu à remplacer dans un nouveau fichier et remplacez l'ancien fichier

Avant de plonger dans le code, il est important que nous prenions note des méthodes suivantes en python :

  • mkstemp() → renvoie un tuple avec un descripteur de fichier et un chemin.
  • open() → Pour lire ou écrire un fichier, vous devez l'ouvrir en utilisant le open() intégré de Python fonction. Il est utilisé pour créer un objet fichier, qui est ensuite utilisé pour appeler d'autres méthodes de support qui lui sont associées.
  • copymode() → méthode en Python utilisée pour copier les bits d'autorisation du chemin source donné vers un chemin de destination donné. Le shutil.copymode () n'affecte pas le contenu du fichier ou les informations sur le propriétaire et le groupe.
  • move() → méthode en Python, qui vous permet de déplacer des fichiers d'un emplacement à un autre.
  • remove() → méthode en Python, qui permet de retirer ou de supprimer un chemin de fichier.

Maintenant que nous savons pourquoi chacune des méthodes ci-dessus est utilisée, voyons comment le code fonctionne (veuillez suivre les commentaires pour une meilleure prise en main du code) :

#importing necessary functions and modules
from tempfile import mkstemp
from shutil import move, copymode
from os import fdopen, remove

#store the path of the file in a variable
path="C:\\...\demo.txt"

#define the replace function
def replace(file_path, Avengers, Finxters):
    
   #Create temp file
   fd, abs_path = mkstemp()
   with fdopen(fd,'w') as new_file:
       with open(file_path,'r') as old_file:
           for line in old_file:
               new_file.write(line.replace(Avengers,Finxters))
               
   #Copy the file permissions from the old file to the new file
   copymode(file_path, abs_path)
   
   #Remove original file
   remove(file_path)
   
   #Move new file
   move(abs_path, file_path)

   
#calling the replace() method
replace(path,'Avengers','Finxters')

Méthode 4 :Utilisation de Fileinput.fileinput() et de l'opérateur sur place

fileinput() méthode en Python qui vous permet d'accepter un fichier en entrée, puis de mettre à jour ou d'ajouter les données dans le fichier.

Le code suivant illustre l'utilisation de fileinput() méthode pour remplacer du texte dans un fichier.

import fileinput
import sys

def replace(file, searchExp, replaceExp):
   for line in fileinput.input(file, inplace=1):
       line = line.replace(searchExp, replaceExp)
       sys.stdout.write(line)
       
old_txt = "Avengers"
new_txt = "Finxters"
file = "demo.txt"
replace(file, old_txt, new_txt)

Méthode 5 :Utiliser le module Regex

Une autre façon de résoudre notre problème consiste à utiliser le module regex de Python. Le code ci-dessous utilise les fonctions suivantes du module regex :

  • re.compile() → utilisé pour compiler un modèle d'expression régulière et le convertir en un objet d'expression régulière qui peut ensuite être utilisé pour la correspondance.
  • re.escape() → utilisé pour échapper les caractères spéciaux dans un motif.

Notez également que le sub() la fonction est utilisée pour remplacer un motif (Avengers dans cet exemple) avec une chaîne (Finxters dans cet exemple) ou le résultat d'une fonction.

#importing the regex module
import re

#defining the replace method
def replace(filePath, text, subs, flags=0):
    
   #open the file
   with open(file_path, "r+") as file:

       #read the file contents
       file_contents = file.read()
       text_pattern = re.compile(re.escape(text), flags)
       file_contents = text_pattern.sub(subs, file_contents)
       file.seek(0)
       file.truncate()
       file.write(file_contents)

       
file_path="demo.txt"
text="Avengers"
subs="Finxters"

#calling the replace method
replace(file_path, text, subs)

Conclusion

Par conséquent, pour rechercher et remplacer une chaîne en Python, vous pouvez soit charger le fichier entier, puis remplacer le contenu dans le même fichier comme nous l'avons fait dans notre méthode conventionnelle (Méthode 1 ) ou vous pouvez choisir d'utiliser une méthode plus efficace en utilisant des gestionnaires de contexte comme expliqué dans la Méthode 2 ou vous pouvez même choisir de sélectionner le module regex et jouer avec de nombreux choix.

J'espère que vous avez trouvé cet article utile. Restez à l'écoute pour les futures mises à jour !