web-dev-qa-db-fra.com

remplacement du texte dans un fichier avec Python

Je suis nouveau sur Python. Je veux pouvoir ouvrir un fichier et remplacer chaque occurrence de certains mots par un remplacement donné via Python. Par exemple, remplacez chaque mot «zéro» par «0», «temp» par «bob» et dites «garbage» par «rien».

J'avais d'abord commencé à utiliser ceci:

for line in fileinput.input(fin):
        fout.write(line.replace('zero', '0'))
        fout.write(line.replace('temp','bob'))
        fout.write(line.replace('garbage','nothing'))

mais je ne pense pas que ce soit une façon, même à distance, de le faire. J'ai ensuite pensé faire des déclarations si pour vérifier si la ligne contient ces éléments et si c'est le cas, remplacez celle que contient la ligne, mais d'après ce que je sais de Python, cette solution n'est pas non plus vraiment idéale. J'aimerais savoir quelle est la meilleure façon de procéder. Merci d'avance!

25
shadonar

Cela devrait le faire

replacements = {'zero':'0', 'temp':'bob', 'garbage':'nothing'}

with open('path/to/input/file') as infile, open('path/to/output/file', 'w') as outfile:
    for line in infile:
        for src, target in replacements.iteritems():
            line = line.replace(src, target)
        outfile.write(line)

EDIT: Pour adresser le commentaire d'Eildosa , si vous voulez le faire sans écrire dans un autre fichier, vous devrez lire tout le fichier source en mémoire:

lines = []
with open('path/to/input/file') as infile:
    for line in infile:
        for src, target in replacements.iteritems():
            line = line.replace(src, target)
        lines.append(line)
with open('path/to/input/file', 'w') as outfile:
    for line in lines:
        outfile.write(line)

Edit: Si vous utilisez Python 3.x, utilisez replacements.items() au lieu de replacements.iteritems()

71
inspectorG4dget

Je pourrais envisager d'utiliser une dict et re.sub pour quelque chose comme ceci:

import re
repldict = {'zero':'0', 'one':'1' ,'temp':'bob','garage':'nothing'}
def replfunc(match):
    return repldict[match.group(0)]

regex = re.compile('|'.join(re.escape(x) for x in repldict))
with open('file.txt') as fin, open('fout.txt','w') as fout:
    for line in fin:
        fout.write(regex.sub(replfunc,line))

Ceci présente un léger avantage sur replace en ce sens qu'il est un peu plus robuste pour les correspondances qui se chevauchent.

7
mgilson

Si votre fichier est court (voire pas très long), vous pouvez utiliser l'extrait de code suivant pour remplacer le texte à la place:

# Replace variables in file
with open('path/to/in-out-file', 'r+') as f:
    content = f.read()
    f.seek(0)
    f.truncate()
    f.write(content.replace('replace this', 'with this'))
6
John Calcote

Le moyen essentiel est

  • read(),
  • data = data.replace() aussi souvent que nécessaire, puis
  • write().

Si vous lisez et écrivez toutes les données à la fois ou en petites parties, c'est à vous de décider. Vous devez le faire dépendre de la taille de fichier attendue.

read() peut être remplacé par l'itération sur l'objet fichier.

4
glglgl

Une manière plus rapide d'écrire ce serait ...

in = open('path/to/input/file').read()
out = open('path/to/input/file', 'w')
replacements = {'zero':'0', 'temp':'bob', 'garbage':'nothing'}
for i in replacements.keys():
    in = in.replace(i, replacements[i])
out.write(in)
out.close

Cela a éliminé beaucoup d'itérations suggérées par les autres réponses et a accéléré le processus pour les fichiers plus longs.

2
Matt Olan

Voici un exemple court et simple que je viens d'utiliser:

Si:

fp = open("file.txt", "w")

Ensuite:

fp.write(line.replace('is', 'now'))
// "This is me" becomes "This now me"

Ne pas:

line.replace('is', 'now')
fp.write(line)
// "This is me" not changed while writing
0
AmazingDayToday

En lisant depuis l'entrée standard, écrivez 'code.py' comme suit:

import sys

rep = {'zero':'0', 'temp':'bob', 'garbage':'nothing'}

for line in sys.stdin:
    for k, v in rep.iteritems():
        line = line.replace(k, v)
    print line

Ensuite, exécutez le script avec redirection ou piping ( http://en.wikipedia.org/wiki/Redirection_(computing) )

python code.py < infile > outfile
0
satomacoto