El archivo Python se abre / cierra cada vez que se mantiene abierto hasta que el proceso finaliza

Tengo aproximadamente 50 GB de archivo de texto y estoy revisando los primeros caracteres de cada línea y escribiéndolos en otros archivos especificados para ese texto de inicio.

Por ejemplo. mi entrada contiene:

cow_ilovecow dog_whreismydog cat_thatcatshouldgotoreddit dog_gotitfromshelter ............... 

Por lo tanto, quiero procesarlos en categorías de vacas, perros y gatos (alrededor de 200) así que,

 if writeflag==1: writefile1=open(writefile,"a") #writefile is somedir/dog.txt.... writefile1.write(remline+"\n") #writefile1.close() 

Entonces, ¿cuál es la mejor manera, debo cerrar? De lo contrario, si lo mantengo abierto, ¿ writefile1=open(writefile,"a") haciendo lo correcto?

Definitivamente deberías intentar abrir / cerrar el archivo lo menos posible

Porque incluso comparando con la lectura / escritura de archivos, abrir / cerrar archivos es mucho más costoso

Considere dos bloques de código:

 f=open('test1.txt', 'w') for i in range(1000): f.write('\n') f.close() 

y

 for i in range(1000): f=open('test2.txt', 'a') f.write('\n') f.close() 

El primero toma 0.025s mientras que el segundo toma 0.309s

Use la instrucción with , cierra automáticamente los archivos por usted, realice todas las operaciones dentro del bloque with , de modo que mantendrá los archivos abiertos para usted y los cerrará una vez que esté fuera del bloque with .

 with open(inputfile)as f1, open('dog.txt','a') as f2,open('cat.txt') as f3: #do something here 

EDITAR: Si conoce todos los nombres de archivo posibles que se usarán antes de la comstackción de su código, entonces usar with es una mejor opción y si no lo hace, debe usar su método, pero en lugar de cerrar el archivo, puede flush los datos al archivo usando writefile1.flush()

Mantenlo abierto todo el tiempo! De lo contrario, le dice al sistema que ha terminado de escribir todo el tiempo y puede decidir descargarlo en el disco en lugar de almacenarlo en búfer. Y por razones obvias, las escrituras en disco son mucho más caras que la escritura en 1 disco.

Si desea adjuntar al archivo y no sobrescribirlo, entonces sí, a es el modo correcto.

Las operaciones de IO consumen demasiado tiempo. Abre y cierra el archivo, también.

Es mucho más rápido si abre ambos archivos (la entrada y la salida), utiliza un búfer de memoria con, digamos, un tamaño de 10 MB para su procesamiento de texto y luego lo escribe en el archivo de salida. Por ejemplo:

 file = {} # just initializing dicts filename = {} with open(file) as f: file['dog'] = None buffer = '' ... #maybe there is a loop here if writeflag: if file['dog'] == None: file['dog'] = open(filename['dog'], 'a') buffer += remline + '\n' if len(buffer) > 1024*1000*10: # 10MB of text files['dog'].write(buffer) buffer = '' for v in files.values(): v.close()