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!
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()
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.
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'))
Le moyen essentiel est
read()
,data = data.replace()
aussi souvent que nécessaire, puiswrite()
.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.
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.
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
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