escribir y reemplazar línea particular en el archivo

Quiero reemplazar el valor de la clave (es decir, addons_path , addons_path ) con $$$$ .

El archivo de texto de entrada contiene lo siguiente:

 #Test.txt# addons_path=/bin/root admin_passwd = abctest auto_reload = False csv_internal_sep = , db_host = 90.0.0.1 

Archivo de texto de salida:

 #Test2.txt# admin_passwd = abctest auto_reload = False csv_internal_sep = , db_host = $$$$$ 

Quiero reemplazar el valor de una clave en particular y escribirlo en un archivo, luego reemplazar el archivo antiguo por un nuevo.

La siguiente función me da una salida correcta de la sustitución del valor de una clave de importación particular en el archivo de entrada desde pprint import pprint como p

 replace_with = '7777' key = 'db_host' fileref = open('/Files/replace_key/test','r+') line = fileref.readline() config = [] while line: split_line = line.split('=') if len(split_line ) == 2: config.append( ( split_line[0].strip(' \n'),split_line[1].strip(' \n') ) ) print line line = fileref.readline() fileref.close() config = dict(config) print config config.update({'db_host':replace_with}) p(config) 

Pero no puedo aplicarlo a todo el archivo de texto.

Si quieres hacer eso con Python, puedes usar la siguiente función:

 def replace_in_file(filename, key, new_value): f = open(filename, "r") lines = f.readlines() f.close() for i, line in enumerate(lines): if line.split('=')[0].strip(' \n') == key: lines[i] = key + ' = ' + new_value + '\n' f = open(filename, "w") f.write("".join(lines)) f.close() replace_in_file("file.txt", 'db_host', "7777") 

Esto es mucho más simple logrado con las herramientas UNIX.

Sin embargo aquí está mi solución:

 bash-4.3$ cat - > test.txt #Test.txt# addons_path=/bin/root admin_passwd = abctest auto_reload = False csv_internal_sep = , db_host = 90.0.0.1 bash-4.3$ python Python 2.7.6 (default, Apr 28 2014, 00:50:45) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> with open("test.txt", "r") as f: ... pairs = (line.split("=", 1) for line in f if not line.startswith("#")) ... d = dict([(k.strip(), v.strip()) for (k, v) in pairs]) ... >>> d["db_host"] = "$$$$" >>> with open("out.txt", "w") as f: ... f.write("\n".join(["{0:s}={1:s}".format(k, v) for k, v in d.items()])) ... >>> bash-4.3$ cat out.txt db_host=$$$$ admin_passwd=abctest auto_reload=False csv_internal_sep=, addons_path=/bin/rootbash-4.3$ 
  1. Lea el archivo y analice los pares clave / valor con = en un dict ( ignorando los comentarios ).
  2. Cambie la clave db_host en el diccionario resultante.
  3. Escriba el diccionario usando = como separadores clave / valor.

Disfrutar 🙂

Actualización: Como un conjunto reutilizable de funciones:

 def read_config(filename): with open(filename, "r") as f: pairs = (line.split("=", 1) for line in f if not line.startswith("#")) return dict([(k.strip(), v.strip()) for (k, v) in pairs]) def write_config(d, filename): with open(filename, "w") as f: f.write("\n".join(["{0:s}={1:s}".format(k, v) for k, v in d.items()])) 

¿Qué tal algo como esto?

 def replace_string(s): s = s.replace('db_host','$$$$') return s with open('test.txt','r') as fo: line = fo.read() # you could use strip() or split() additionally new_string = replace_string(line)