python prepend

Anteponer una línea a un archivo existente en Python



prepend (9)

Aquí hay un trazador de líneas 3 que creo que es claro y flexible. Utiliza la función list.insert, por lo que si realmente quieres anteponer al archivo usa l.insert (0, ''insert_str''). Cuando hice esto para un Módulo de Python que estoy desarrollando, utilicé l.insert (1, ''insert_str'') porque quería omitir la cadena ''# - - codificación: utf-8 - -'' en la línea 0. Aquí está el código.

f = open(file_path, ''r''); s = f.read(); f.close() l = s.splitlines(); l.insert(0, ''insert_str''); s = ''/n''.join(l) f = open(file_path, ''w''); f.write(s); f.close()

Necesito agregar una sola línea a la primera línea de un archivo de texto y parece que las únicas opciones disponibles para mí son más líneas de código de las que esperaría de Python. Algo como esto:

f = open(''filename'',''r'') temp = f.read() f.close() f = open(''filename'', ''w'') f.write("#testfirstline") f.write(temp) f.close()

¿No hay una manera más fácil? Además, veo este ejemplo de dos controles con más frecuencia que abrir un único identificador para leer y escribir (''r +''): ¿por qué?


Hace el trabajo sin leer todo el archivo en la memoria, aunque puede no funcionar en Windows

def prepend_line(path, line): with open(path, ''r'') as old: os.unlink(path) with open(path, ''w'') as new: new.write(str(line) + "/n") shutil.copyfileobj(old, new)


Me quedaría con lecturas y escrituras separadas, pero ciertamente podemos expresar cada una de manera más concisa:

Python2:

with file(''filename'', ''r'') as original: data = original.read() with file(''filename'', ''w'') as modified: modified.write("new first line/n" + data)

Python3:

with open(''filename'', ''r'') as original: data = original.read() with open(''filename'', ''w'') as modified: modified.write("new first line/n" + data)

Nota: la función file () no está disponible en python3.


Otro enfoque:

with open("infile") as f1: with open("outfile", "w") as f2: f2.write("#test firstline") for line in f1: f2.write(line)

o un trazador de líneas uno:

open("outfile", "w").write("#test firstline/n" + open("infile").read())

Gracias por la oportunidad de pensar en este problema :)

Aclamaciones


Puede guardar una llamada de escritura con esto:

f.write(''#testfirstline/n'' + temp)

Cuando use ''r +'', tendrá que rebobinar el archivo después de leer y antes de escribir.


Python facilita muchas cosas y contiene bibliotecas y contenedores para muchas operaciones comunes, pero el objetivo no es ocultar verdades fundamentales.

La verdad fundamental que está encontrando aquí es que generalmente no puede anteponer datos a una estructura plana existente sin reescribir toda la estructura. Esto es cierto independientemente del idioma.

Hay formas de guardar un identificador de archivo o hacer que el código sea menos legible, muchas de las cuales se proporcionan en otras respuestas, pero ninguna cambia la operación fundamental: debe leer el archivo existente, luego escribir los datos que desea anteponer, seguido de los datos existentes que leíste

Por supuesto, sálvate el manejador de archivos, pero no intentes empaquetar esta operación en el menor número posible de líneas de código. De hecho, nunca busque la menor cantidad de líneas de código, eso es ofuscación, no programación.


Si desea anteponer en el archivo después de un texto específico, puede usar la función a continuación.

def prepend_text(file, text, after=None): '''''' Prepend file with given raw text '''''' f_read = open(file, ''r'') buff = f_read.read() f_read.close() f_write = open(file, ''w'') inject_pos = 0 if after: pattern = after inject_pos = buff.find(pattern)+len(pattern) f_write.write(buff[:inject_pos] + text + buff[inject_pos:]) f_write.close()

Entonces, primero abre el archivo, lo lee y lo guarda todo en una cadena. Luego tratamos de encontrar el número de personaje en la cadena donde se realizará la inyección. Luego, con una sola escritura y una indexación inteligente de la cadena, podemos reescribir todo el archivo, incluido el texto inyectado ahora.


Una posibilidad es la siguiente:

import os open(''tempfile'', ''w'').write(''#testfirstline/n'' + open(''filename'', ''r'').read()) os.rename(''tempfile'', ''filename'')


with open("file", "r+") as f: s = f.read(); f.seek(0); f.write("prepend/n" + s)