Reemplazo de palabras en un archivo de texto usando un diccionario

Estoy intentando abrir un archivo de texto y luego leerlo reemplazando ciertas cadenas con cadenas almacenadas en un diccionario.

Basado en las respuestas a ¿Cómo edito un archivo de texto en Python? Podría sacar los valores del diccionario antes de realizar la sustitución, pero parece que hacer un ciclo de bucle a través del diccionario es más eficiente.

El código no produce ningún error, pero tampoco hace ningún reemplazo.

import fileinput text = "sample file.txt" fields = {"pattern 1": "replacement text 1", "pattern 2": "replacement text 2"} for line in fileinput.input(text, inplace=True): line = line.rstrip() for i in fields: for field in fields: field_value = fields[field] if field in line: line = line.replace(field, field_value) print line 

Utilicé items() para iterar sobre la key y los values de sus fields dictados.

Salto las líneas en blanco con continue y limpiar las otras con rstrip()

Reemplazo todas las keys encontradas en la line por los values en los fields dictados y escribo todas las líneas con print .

 import fileinput text = "sample file.txt" fields = {"pattern 1": "replacement text 1", "pattern 2": "replacement text 2"} for line in fileinput.input(text, inplace=True): line = line.rstrip() if not line: continue for f_key, f_value in fields.items(): if f_key in line: line = line.replace(f_key, f_value) print line 

Si está más familiarizado con Python, puede usar consejos de la documentación oficial :

7.1. cadena – operaciones de cadena comunes

Y subclase , la clase de plantilla , en la que define de alguna manera que cada mundo será un nuevo marcador de posición , y luego con safe_substitute() Usted podría obtener una solución agradable y confiable.

Si puede encontrar un patrón de re.sub regulares que cubra todas sus claves, podría usar re.sub para una solución muy eficiente: solo necesita un pase en lugar de analizar todo el texto para cada término de búsqueda.

En su título, usted menciona “reemplazar palabras”. En ese caso, '\w+' funcionaría bien.

 import re fields = {"pattern 1": "replacement text 1", "pattern 2": "replacement text 2"} words_to_replace = r'\bpattern \d+\b' text = """Based on answers to How do I edit a text file in Python? pattern 1 I could pull out the dictionary values before doing the replacing, but looping through the dictionary seems more efficient. Test pattern 2 The code doesn't produce any errors, but also doesn't do any replacing. pattern 3""" def replace_words_using_dict(matchobj): key = matchobj.group(0) return fields.get(key, key) print(re.sub(words_to_replace, replace_words_using_dict, text)) 

Produce:

 Based on answers to How do I edit a text file in Python? replacement text 1 I could pull out the dictionary values before doing the replacing, but looping through the dictionary seems more efficient. Test replacement text 2 The code doesn't produce any errors, but also doesn't do any replacing. pattern 3 

Además, tenga mucho cuidado al modificar un archivo en su lugar. Te aconsejo que escribas un segundo archivo con los reemplazos. Una vez que esté 100% seguro de que funciona perfectamente, podría cambiar a inplace=True .

 import fileinput text = "sample file.txt" fields = {"pattern 1": "replacement text 1", "pattern 2": "replacement text 2"} for line in fileinput.input(text, inplace=True): line = line.rstrip() for field in fields: if field in line: line = line.replace(field, fields[field]) print line 

Simplemente descubrí cómo reemplazar muchas palabras diferentes en un archivo txt de una sola vez, iterando a través de un diccionario (solo palabras completas). Sería realmente molesto si quisiera reemplazar “1” con “John”, pero terminaría convirtiendo “12” en “John2”. El siguiente código es lo que funciona para mí.

 import re match = {} # create a dictionary of words-to-replace and words-to-replace-with f = open("filename","r") data = f.read() # string of all file content def replace_all(text, dic): for i, j in dic.items(): text = re.sub(r"\b%s\b"%i, j, text) # r"\b%s\b"% enables replacing by whole word matches only return text data = replace_all(data,match) print(data) # you can copy and paste the result to whatever file you like 

Así es como lo haría:

 fields = {"pattern 1": "replacement text 1", "pattern 2": "replacement text 2"} with open('yourfile.txt', 'w+') as f: s = f.read() for key in fields: s = s.replace(key, fields[key]) f.write(s)