una matriz filas fila eliminar documentacion crear como columnas columna borrar python csv python-2.7 module delete-row

matriz - Cómo eliminar filas CSV en python



eliminar filas en python pandas (3)

CSV no es un formato de base de datos. Se lee y escribe en conjunto. No puedes eliminar filas en el medio. Entonces, la única forma de hacerlo sin crear un tercer archivo es leer completamente el archivo en la memoria y luego escribirlo, sin las filas ofensivas.

Pero, en general, es mejor usar un tercer archivo.

Estoy tratando de comparar dos archivos csv (archivoA y archivoB) y eliminar las filas del archivoA que no se encuentran en el archivoB. Quiero poder hacer esto sin crear un tercer archivo. Pensé que podría hacer esto usando el módulo de escritor csv pero ahora estoy adivinando a mí mismo.

Actualmente, estoy usando el siguiente código para registrar mis datos de comparación del archivo B:

removal_list = set() with open(''fileB'', ''rb'') as file_b: reader1 = csv.reader(file_b) next(reader1) for row in reader1: removal_list.add((row[0], row[2]))

Aquí es donde estoy atascado y no sé cómo eliminar las filas:

with open(''fileA'', ''ab'') as file_a: with open(''fileB'', ''rb'') as file_b: writer = csv.writer(file_a) reader2 = csv.reader(file_b) next(reader2) for row in reader2: if (row[0], row[2]) not in removal_list: # If row was not present in file B, Delete it from file A. #stuck here: writer.<HowDoIRemoveRow>(row)


Como Lennart describió, no puede modificar un archivo CSV en el lugar mientras lo itera.

Si realmente se opone a la creación de un tercer archivo, es posible que desee estudiar el uso de un búfer de cadena con StringIO , con la idea de que cree los nuevos contenidos deseados del archivo A en la memoria. Al final de su script, puede escribir el contenido del búfer sobre el archivo A.

from cStringIO import StringIO with open(''fileB'', ''rb'') as file_b: new_a_buf = StringIO() writer = csv.writer(new_a_buf) reader2 = csv.reader(file_b) next(reader2) for row in reader2: if (row[0], row[2]) not in removal_list: writer.writerow(row) # At this point, the contents (new_a_buf) exist in memory with open(''fileA'', ''wb'') as file_a: file_a.write(new_a_buf.getvalue())


Esta solución utiliza la entrada de fileinput con inplace=True , que escribe en un archivo temporal y luego lo renombra automáticamente al final de su nombre de archivo. No puede eliminar filas de un archivo, pero puede reescribirlas solo con las que desee.

si el argumento de palabra clave inplace=1 se pasa a fileinput.input() o al constructor FileInput , el archivo se mueve a un archivo de copia de seguridad y la salida estándar se dirige al archivo de entrada (si es un archivo del mismo nombre que el archivo de copia de seguridad) ya existe, será reemplazado en silencio). Esto hace posible escribir un filtro que reescribe su archivo de entrada en su lugar.

presentar un

h1,h2,h3 a,b,c d,e,f g,h,i j,k,l

fileB

h1,h2,h3 a,b,c 1,2,3 g,h,i 4,5,6

import fileinput, sys, csv with open(''fileB'', ''rb'') as file_b: r = csv.reader(file_b) next(r) #skip header seen = {(row[0], row[2]) for row in r} f = fileinput.input(''fileA'', inplace=True) # sys.stdout is redirected to the file print next(f), # write header as first line w = csv.writer(sys.stdout) for row in csv.reader(f): if (row[0], row[2]) in seen: # write it if it''s in B w.writerow(row)

presentar un

h1,h2,h3 a,b,c g,h,i