cambiar la primera línea de un archivo en python

Solo necesito leer la primera línea de un archivo enorme y cambiarlo.

¿Hay algún truco para cambiar solo la primera línea de un archivo y guardarlo como otro archivo utilizando Python? Todo mi código está hecho en python y me ayudaría a mantener la coherencia.

La idea es no tener que leer y luego escribir todo el archivo.

shutil.copyfileobj() debería ser mucho más rápido que ejecutarse línea por línea. Nota de la documentación:

Tenga en cuenta que si la posición actual del archivo del objeto [from_file] no es 0, solo se copiarán los contenidos desde la posición actual del archivo hasta el final del archivo.

Así:

 import shutil from_file = open("filename") line = from_file.readline() # make any changes to line here to_file = open("filename",mode="w") to_file.write(line) shutil.copyfileobj(from_file, to_file) 

Si desea modificar la línea superior de un archivo y guardarlo con un nuevo nombre de archivo, no es posible modificar simplemente la primera línea sin iterar sobre todo el archivo. En el lado positivo, siempre y cuando no esté imprimiendo en el terminal, modificar la primera línea de un archivo es MUY, MUY rápido, incluso en archivos muy grandes.

Suponiendo que está trabajando con archivos basados ​​en texto (no binarios), esto debería ajustarse a sus necesidades y funcionar lo suficientemente bien para la mayoría de las aplicaciones.

 import os newline = os.linesep # Defines the newline based on your OS. source_fp = open('source-filename', 'r') target_fp = open('target-filename', 'w') first_row = True for row in source_fp: if first_row: row = 'the first row now says this.' first_row = False target_fp.write(row + newline) 

A menos que la nueva línea tenga la misma longitud que la línea anterior, no puede hacer esto. Si es así, podría resolver este problema a través de un mmap .

El módulo sh funcionó para mí:

 import sh first = "new string" sh.sed("-i", "1s/.*/" + first + "/", "file.x") 

Una solución alternativa que no requiere iteración sobre las líneas que no son de interés.

 def replace_first_line( src_filename, target_filename, replacement_line): f = open(src_filename) first_line, remainder = f.readline(), f.read() t = open(target_filename,"w") t.write(replacement_line + "\n") t.write(remainder) t.close() 

La solución que utilizaría es crear un archivo que falte en la primera línea antigua.

from_file.readline() # and discard shutil.copyfileobj(from_file, tail_file)

luego crea un archivo con la nueva primera línea

luego use lo siguiente para concatenar el archivo newfirstline y tail_file

 for f in ['newfirstline.txt','tail_file.txt']: with open(f,'rb') as fd: shutil.copyfileobj(fd, wfd, 1024*1024*10