Tengo una muy grande (~8 gb) archivo de texto que tiene las líneas muy largas. Me gustaría sacar líneas en intervalos seleccionados de este archivo y ponerlos en otro archivo de texto. De hecho, mi pregunta es muy similar a la este y este pero me quedo pegado cuando intento seleccionar un rango de líneas en lugar de una sola línea.

Hasta el momento este es el único enfoque que he llegado a trabajar:

lines = readin.readlines()
out1.write(str(lines[5:67]))
out2.write(str(lines[89:111]))

Sin embargo esto me da una lista y me gustaría que a la salida de un archivo con un formato idéntico al del archivo de entrada (una línea por cada fila)

InformationsquelleAutor Stedy | 2010-08-24

5 Comentarios

  1. 4

    Puede llamar a unirse a los rangos.

    lines = readin.readlines()
    out1.write(''.join(lines[5:67]))
    out2.write(''.join(lines[89:111]))
    • Debe ser la salida out1.escribir(«.join(líneas[5:67])), y lo mismo para out2 porque readlines no quitar final de las líneas
    • uy, fijo
    • Esto no debería ser aceptada respuesta – usted no acaba de leer 8 GB en la memoria a menos que tenga una muy buena razón para hacerlo.
  2. 2

    podría sugiero no almacenar el archivo completo (ya que es grande) como por uno de sus enlaces?

    f = open('file')
    n = open('newfile', 'w')
    for i, text in enumerate(f):
        if i > 4 and i < 68:
            n.write(text)
        elif i > 88 and i < 112:
            n.write(text)
        else:
            pass

    también me gustaría recomendar el uso de » con » en lugar de abrir y cerrar el archivo, pero yo por desgracia no soy permitió la actualización a una nueva suficientemente versión de python para que de aquí : (.

  3. 1

    La primera cosa que usted debe pensar cuando se enfrenta a un problema como este, es para evitar leer todo el archivo en la memoria a la vez. readlines() va a hacer, por lo que el método específico que debe ser evitado.

    Por suerte, tenemos una excelente biblioteca estándar de Python, itertools. itertools tiene muchas funciones útiles, y uno de ellos es islice. islice itera a través de un iterable (tales como listas, generadores, archivo-como objetos, etc.) y devuelve un generador que contiene el rango especificado:

    itertools.islice(iterable, start, stop[, step])

    Hacer un iterador que devuelve los elementos seleccionados desde el iterable. Si inicio es distinto de cero,
    a continuación, los elementos de la iterable se saltean hasta que de inicio se alcanza.
    Después de esto, los elementos son devueltos de forma consecutiva, a menos que el paso es establecer
    más de uno que se traduce en elementos omitidos. Si la parada es Ninguno,
    luego de la iteración continúa hasta que el iterador está agotado, si en absoluto;
    de lo contrario, se detiene en la posición especificada. A diferencia de los regulares de la corte,
    islice() no admite valores negativos para iniciar, detener, o de paso.
    Puede ser utilizado para extraer relacionados con los campos de datos en los que los internos
    la estructura ha sido aplanado (por ejemplo, un multi-línea de informe de mayo de
    lista un nombre de campo en cada tercera línea)

    Utilizando esta información, junto con la str.únete método, por ejemplo, es posible extraer las líneas de 10-19 mediante este sencillo código:

    from itertools import islice
    
    # Add the 'wb' flag if you use Windows
    with open('huge_data_file.txt', 'wb') as data_file: 
        txt = '\n'.join(islice(data_file, 10, 20))

    Tenga en cuenta que cuando el bucle sobre el archivo objeto, la nueva línea char es despojado de las líneas, por lo que usted necesita para establecer \n como la de unirse a char.

  4. 0

    (Respuesta parcial) con el fin De hacer que su enfoque actual de trabajo tendrás que escribir línea por línea. Por ejemplo:

    lines = readin.readlines()
    
    for each in lines[5:67]:
        out1.write(each)
    
    for each in lines[89:111]:
        out2.write(each)
  5. 0
    path = "c:\someplace\"

    Abrir 2 archivos de texto. Uno para leer y otro para escribir

    f_in = open(path + "temp.txt", 'r')
    f_out = open(path + output_name, 'w')

    ir a través de cada línea del archivo de entrada

    for line in f_in:
        if i_want_to_write_this_line == True:
            f_out.write(line)

    cierre los archivos cuando se hace

    f_in.close()
    f_out.close()

Dejar respuesta

Please enter your comment!
Please enter your name here