Tengo un archivo> 1g, quiero dividirlo en archivos con 100k líneas cada uno

Quiero hacer esto en python pero estoy perplejo. No podré cargar todo el archivo en el ram sin que las cosas se vuelvan inestables, así que quiero leerlo línea por línea … Cualquier consejo sería apreciado.

Si es absolutamente necesario dividir el archivo, ¿por qué no usar la utilidad de split * nix?

http://ss64.com/bash/split.html

 split -l 100000 inputfile 

Una idea podría ser la siguiente:

 import itertools with open('the1gfile.txt') as inf: for i in itertools.count(): with open('outfile%d.txt' % i, 'w') as ouf: for linenum, line in enumerate(inf): ouf.write(line) if linenum == 99999: break else: break 

La statement with requiere Python 2.6 o superior, o 2.5 con una from __future__ import with_statement en la parte superior del módulo (esa es la razón por la que estoy usando el formato de cadena antiguo para hacer los nombres de los archivos de salida; el nuevo estilo no trabaje en la versión 2.5, y no nos dice qué versión de Python desea utilizar; sustituya el nuevo formato de estilo si su versión de Python lo admite, por supuesto ;-).

itertools.count() produce 0, 1, 2, … y así sucesivamente, sin límite (ese bucle se termina solo cuando finalmente se ejecuta la break condicional al final).

for linenum, line in enumerate(inf): lee una línea a la vez (con algo de búfer para la velocidad) y configura linoum en 0, 1, 2, … y así sucesivamente, y rompemos ese bucle después de 100.000 líneas ( La próxima vez, el bucle for continuará leyendo exactamente donde este se detuvo.

La cláusula else: del bucle for ejecuta solo si la break dentro de ese bucle no lo hizo, por lo tanto, si hemos leído menos de 100,000 líneas, es decir, cuando el archivo de entrada finaliza. Tenga en cuenta que habrá un archivo de salida vacío si el número de líneas en el archivo de entrada es un múltiplo exacto de 100,000.

Espero que esto haga que cada parte del mecanismo sea lo suficientemente clara para usted …