Necesito leer un archivo grande, línea por línea. Digamos que el archivo tiene más de 5GB y necesito leer cada línea, pero obviamente no quiero usarlo readlines()
porque creará una lista muy grande en la memoria.
¿Cómo funcionará el siguiente código para este caso? ¿Está xreadlines
leyendo uno por uno en la memoria? ¿Se necesita la expresión del generador?
f = (line for line in open("log.txt").xreadlines()) # how much is loaded in memory?
f.next()
Además, ¿qué puedo hacer para leer esto en orden inverso, al igual que el tail
comando Linux ?
Encontré:
http://code.google.com/p/pytailer/
y
" cabeza de pitón, cola y lectura hacia atrás por líneas de un archivo de texto "
¡Ambos funcionaron muy bien!
Respuestas:
Proporcioné esta respuesta porque Keith, aunque breve, no cierra el archivo explícitamente
fuente
for
bucle que itera sobre las líneas, puede usarlochunk = infile.read(chunksize)
para leer fragmentos de tamaño limitado independientemente de su contenido. Tendrá que buscar nuevas líneas dentro de los fragmentos.Todo lo que necesita hacer es usar el objeto de archivo como iterador.
Aún mejor es usar el administrador de contexto en las versiones recientes de Python.
Esto también cerrará automáticamente el archivo.
fuente
Un enfoque de la vieja escuela:
fuente
Es mejor usar un iterador en su lugar. Relevante: http://docs.python.org/library/fileinput.html
De los documentos:
Esto evitará copiar todo el archivo en la memoria a la vez.
fuente
close()
método delFileInput
objeto de clase devuelto cuando finaliza el ciclo, por lo que evitaría usarlo de esta manera. En Python 3.2 finalmente se han hechofileinput
compatibles con el protocolo del administrador de contexto que aborda este problema (pero el código aún no se escribiría de la manera que se muestra).Esto es lo que debe hacer si no tiene nuevas líneas en el archivo:
fuente
Por favor intente esto:
fuente
No podía creer que pudiera ser tan fácil como lo hizo parecer la respuesta de @ john-la-rooy. Entonces, recreé el
cp
comando usando lectura y escritura línea por línea. Es LOCO RÁPIDO.fuente
readline
estandariza las terminaciones de línea, esto tiene el efecto secundario de convertir documentos con terminaciones de línea DOS a terminaciones de\r\n
línea Unix de\n
. Toda mi razón para buscar este tema fue que necesitaba convertir un archivo de registro que recibe una mezcla de terminaciones de línea (porque el desarrollador utilizó ciegamente varias bibliotecas .NET). Me sorprendió descubrir que después de mi prueba de velocidad inicial, no necesitaba regresar arstrip
las líneas. ¡Ya era perfecto!El proyecto Blaze ha recorrido un largo camino en los últimos 6 años. Tiene una API simple que cubre un subconjunto útil de características de pandas.
dask.dataframe se encarga de fragmentar internamente, admite muchas operaciones en paralelo y le permite exportar rebanadas a pandas fácilmente para operaciones en memoria.
fuente
Aquí está el código para cargar archivos de texto de cualquier tamaño sin causar problemas de memoria. Admite archivos de tamaño gigabytes
https://gist.github.com/iyvinjose/e6c1cb2821abd5f01fd1b9065cbc759d
descargue el archivo data_loading_utils.py e impórtelo a su código
uso
El método process_lines es la función de devolución de llamada. Se llamará a todas las líneas, con datos de parámetros que representan una sola línea del archivo a la vez.
Puede configurar la variable CHUNK_SIZE dependiendo de las configuraciones de hardware de su máquina.
fuente
¿Qué tal esto? Divida su archivo en fragmentos y luego léalo línea por línea, porque cuando lea un archivo, su sistema operativo almacenará en caché la siguiente línea. Si está leyendo el archivo línea por línea, no está haciendo un uso eficiente de la información almacenada en caché.
En su lugar, divida el archivo en fragmentos y cargue todo el fragmento en la memoria y luego realice el procesamiento.
fuente
¡Gracias! Recientemente me he convertido a Python 3 y me he sentido frustrado al usar readlines (0) para leer archivos grandes. Esto resolvió el problema. Pero para obtener cada línea, tuve que hacer un par de pasos adicionales. Cada línea fue precedida por una "b", que supongo que estaba en formato binario. El uso de "decode (utf-8)" lo cambió ascii.
Luego tuve que eliminar un "= \ n" en el medio de cada línea.
Luego dividí las líneas en la nueva línea.
Aquí está el código que comienza justo encima de "imprimir datos" en el código de Arohi.
fuente
Demostré un enfoque de acceso aleatorio de nivel de byte paralelo aquí en esta otra pregunta:
Obtener el número de líneas en un archivo de texto sin líneas de lectura
Algunas de las respuestas ya proporcionadas son agradables y concisas. Me gustan algunos de ellos. Pero realmente depende de lo que quieras hacer con los datos que están en el archivo. En mi caso, solo quería contar líneas, lo más rápido posible en archivos de texto grandes. Mi código se puede modificar para hacer otras cosas, por supuesto, como cualquier código.
fuente
La mejor solución que encontré con respecto a esto, y lo probé en un archivo de 330 MB.
Donde line_length es el número de caracteres en una sola línea. Por ejemplo, "abcd" tiene una longitud de línea 4.
He agregado 2 en longitud de línea para omitir el carácter '\ n' y pasar al siguiente carácter.
fuente
Esto puede ser útil cuando desee trabajar en paralelo y leer solo fragmentos de datos, pero manténgalo limpio con nuevas líneas.
fuente
espero que esto ayude.
fuente