Filtrado de contenido CSV por elementos de lista en Python

Me quedé atascado para obtener el resultado correcto de una simple pieza de código de Python (soy un principiante de Python de todos modos). Dado un archivo de entrada csv (ListInput.csv): pKT, pET, pUT,

y otro archivo csv que contiene características de muchos de estos elementos (Table.csv):

pBR,156,AATGGT,673,HHHTTTT, pUT,54,CCATGTACCTAT,187,PRPTP, pHTM,164,GGTATAG,971,WYT, pKT,12,GCATACAGGAC,349,, pET,87,GTGACGGTA,506,PPMK, 

………… y así

Mi objective es obtener una selección basada en los primeros elementos del archivo csv para obtener un archivo csv como salida (WorkingList.txt), en este caso el resultado esperado sería:

 pKT,12,GCATACAGGAC,349,, pET,87,GTGACGGTA,506,PPMK, pUT,54,CCATGTACCTAT,187,PRPTP, 

Escribí la siguiente secuencia de comandos que no da errores pero termina con un archivo vacío como salida. Estoy tratando de entender por qué desde hace un par de días sin éxito. Cualquier ayuda es gratamente apreciada.

 #!/usr/bin/python import csv v = open('ListInput.csv', 'rt') csv_v = csv.reader(v) vt = open('Table.csv', 'rt') csv_vt = csv.reader(vt) with open("WorkingList.txt", "a+t") as myfile: pass for el in csv_v: for var in csv_vt: if el == var[0]: myfile.write(var) myfile.close() 

Primer problema:

Usted consume su entrada csv csv_vt en la primera iteración. Necesitas hacer:

 vt.seek(0) 

para rebobinar el archivo para el bucle interno. Esto deja un algoritmo de búsqueda O(n^2) pero al menos funciona.

Segundo problema:

estás abriendo y cerrando my_file en el bloque with . Cuando llegas a tu bucle for , mi my_file ya está cerrado porque my_file del bloque with (esa es la garantía del bloque with ).

Si no hubiera tenido el primer problema, había tenido caminos cruzados con “operación en archivo cerrado” al intentar escribir la salida.

Reescribiría la última parte dentro del bloque with y eliminaría el close() .

Tercer problema

no puede escribir una lista en un archivo, primero debe crear un objeto csv.writer .

Entonces, para resumir, podría resolver todos los problemas más el problema de rendimiento con el siguiente código:

 #!/usr/bin/python import csv v = open('ListInput.csv', 'rt') csv_v = csv.reader(v) with open('Table.csv', 'rt') as vt: csv_vt = csv.reader(vt) # create a dictionary to speed up lookup # read the table only once vdict = {var[0]:var for var in csv_vt} with open("WorkingList.txt", newline="") as myfile: # for Python 3.x ## with open("WorkingList.txt", "wb") as myfile: # for Python 2 cw = csv.writer(myfile) for el in csv_v: if el[0] in vdict: cw.writerow(vdict[el]) v.close() 

vdict es la tabla de búsqueda que reemplaza su bucle interno (solo funciona si las “claves” son únicas, lo que parece ser el caso dadas sus muestras de entrada)

Resuelto Aquí está la pieza de código que funciona:

 import csv with open('ListInput.csv', 'rt') as csvfile: readCSV = csv.reader(csvfile, delimiter=',') vinput = [] flist = [] for row in readCSV: vi = row vinput.append(vi) print(vinput) with open('Table.csv', 'rt') as csvfile: readTable = csv.reader(csvfile, delimiter=',') vtable = [] for row in readTable: vt = row for rig in vi: el = rig if str(el) in vt: vtable.append(vt) print(vtable) with open (r'WorkingTable.csv', 'w', newline='') as write_file: write=csv.writer(write_file) write.writerows([r] for r in vtable)