Necesito extraer las primeras 2 filas y la última fila de muchos archivos .txt y .csv. ¿Cómo puedo permitir a un usuario elegir un archivo y generar un nuevo archivo .txt o .csv con solo esas 3 filas?

0
mbf94 16 feb. 2017 a las 11:20

4 respuestas

La mejor respuesta

Esto es lo que necesitas:

def extract_lines(filename,outputname):
    l = []
    with open(filename,'r') as f: 
        for index,line in enumerate(f): #This iterates the file line by line which is memory efficient in case the csv is huge.
            if index < 2: #first 2 lines
                l.append(line)
        if index > 1: # means the file has at least 3 lines
            l.append(line)
    with open(outputname,'w') as f:
        for line in l:
            f.write(line)
1
Alex Fung 16 feb. 2017 a las 08:34
def get_lines(filename, front=2, rear=1):
    result = []
    with open(filename, 'rb') as f:
        for i, val in enumerate(f):
            if i >= front:
                break
            result.append(val)

        back_pos = -2
        f.seek(back_pos, 2)  # jump to the second end byte

        rear_count = 0
        while True:
            if '\n' in f.read(1):
                rear_count += 1

            if rear_count >= rear:
                result.extend(f.readlines())
                break

            back_pos -= 1
            f.seek(back_pos, 2)

    return result

Es fácil leer la primera fila, pero difícil de leer la última fila. Iter filas es muy lento.

1
duke yu 16 feb. 2017 a las 09:09

De esa manera, puede devolver las líneas que desee, solo es cuestión de jugar con el rango

df=open(r"D:\...\nameFile.txt",encoding='utf8')

def etiqueta(df):
    lista=[]
    for line,x in zip(df,range(0,2)):
        lista.append(line)
    return lista

etiqueta(df)
0
Pablo hapax 28 oct. 2019 a las 04:49

Creo que también puedes usar el script bash para cumplir este requisito.

#!/bin/bash

for file in $(find . -name '*.txt' -o -name '*.csv' )
do
    sed -n -e '1,2p' -e '$p' ${file} > "result"${file:(-5)}
done

Este script buscará todos los archivos que terminen en txt o csv. Y cortará las dos primeras líneas y la última línea, almacene estas líneas en un nuevo archivo.

Por ejemplo, tengo tres archivos llamados file1.txt, file2.txt, file3.csv, cortará las tres líneas para cada archivo y las almacenará en result1.txt, result2.txt, result3.csv respectivamente.

0
bwangel 16 feb. 2017 a las 08:46