una txt texto partir open manejo lista linea leer importar guardar especifica crear como carpetas binarios archivos archivo python

txt - manejo de archivos y carpetas en python



Lea archivos de texto grandes en Python, línea por línea, sin cargarlos en la memoria (12)

¡Gracias! Recientemente me he convertido a python 3 y me he sentido frustrado al usar readlines (0) para leer archivos de gran tamaño. 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 "decodificar (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.

b_data=(fh.read(ele[1]))#endat This is one chunk of ascii data in binary format a_data=((binascii.b2a_qp(b_data)).decode(''utf-8'')) #Data chunk in ''split'' ascii format data_chunk = (a_data.replace(''=/n'','''').strip()) #Splitting characters removed data_list = data_chunk.split(''/n'') #List containing lines in chunk #print(data_list,''/n'') #time.sleep(1) for j in range(len(data_list)): #iterate through data_list to get each item i += 1 line_of_data = data_list[j] print(line_of_data)

Aquí está el código que comienza justo arriba de "imprimir datos" en el código de Arohi.

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 usar readlines() porque creará una lista muy grande en la memoria.

¿Cómo funcionará el código siguiente para este caso? ¿ xreadlines lee xreadlines leyendo uno por uno en la memoria? ¿Es necesaria 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 comando de tail 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!


¿Qué tal esto? Divida su archivo en fragmentos y luego léalo línea por línea, porque cuando lee un archivo, su sistema operativo guardará en la siguiente línea. Si está leyendo el archivo línea por línea, no está haciendo un uso eficiente de la información en caché.

En su lugar, divida el archivo en fragmentos y cargue todo el fragmento en la memoria y luego realice su procesamiento.

def chunks(file,size=1024): while 1: startat=fh.tell() print startat #file''s object current position from the start fh.seek(size,1) #offset from current postion -->1 data=fh.readline() yield startat,fh.tell()-startat #doesnt store whole list in memory if not data: break if os.path.isfile(fname): try: fh=open(fname,''rb'') except IOError as e: #file --> permission denied print "I/O error({0}): {1}".format(e.errno, e.strerror) except Exception as e1: #handle other exceptions such as attribute errors print "Unexpected error: {0}".format(e1) for ele in chunks(fh): fh.seek(ele[0])#startat data=fh.read(ele[1])#endat print data


Demostré un enfoque de acceso aleatorio de nivel de bytes paralelo aquí en esta otra pregunta:

Obtener el número de líneas en un archivo de texto sin readlines

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 también, por supuesto, como cualquier código.


El proyecto de 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 paralelas y le permite exportar rebanadas a pandas fácilmente para operaciones en memoria.

import dask.dataframe as dd df = dd.read_csv(''filename.csv'') df.head(10) # return first 10 rows df.tail(10) # return last 10 rows # iterate rows for idx, row in df.iterrows(): ... # group by my_field and return mean df.groupby(df.my_field).value.mean().compute() # slice by column df[df.my_field==''XYZ''].compute()


Es mejor utilizar un iterador en su lugar. Relevante: http://docs.python.org/library/fileinput.html

De los documentos:

import fileinput for line in fileinput.input("filename"): process(line)

Esto evitará copiar todo el archivo en la memoria a la vez.


Esto es lo que debe hacer si no tiene nuevas líneas en el archivo:

with open(''large_text.txt'') as f: while True: c = f.read(1024) if not c: break print(c)


No podía creer que pudiera ser tan fácil como lo hizo la respuesta de @ john-la-rooy. Entonces, recreé el comando cp usando lectura y escritura línea por línea. Es LOCO RÁPIDO.

#!/usr/bin/env python3.6 import sys with open(sys.argv[2], ''w'') as outfile: with open(sys.argv[1]) as infile: for line in infile: outfile.write(line)


Por favor intente esto:

with open(''filename'',''r'',buffering=100000) as f: for line in f: print line


Proporcioné esta respuesta porque Keith, aunque sucinto, no cierra el archivo explícitamente

with open("log.txt") as infile: for line in infile: do_something_with(line)


Todo lo que necesita hacer es usar el objeto de archivo como un iterador.

for line in open("log.txt"): do_something_with(line)

Aún mejor es usar el administrador de contexto en las versiones recientes de Python.

with open("log.txt") as fileobject: for line in fileobject: do_something_with(line)

Esto también cerrará automáticamente el archivo.


Un enfoque de la vieja escuela:

fh = open(file_name, ''rt'') line = fh.readline() while line: # do stuff with line line = fh.readline() fh.close()


f=open(''filename'',''r'').read() f1=f.split(''/n'') for i in range (len(f1)): do_something_with(f1[i])

espero que esto ayude.