BeautifulSoup MemoryError al abrir varios archivos en el directorio

Contexto: Cada semana, recibo una lista de resultados de laboratorio en forma de un archivo html. Cada semana, hay aproximadamente 3,000 resultados con cada conjunto de resultados que tienen entre dos y cuatro tablas asociadas. Para cada resultado / prueba, solo me importa cierta información estándar que se almacena en una de estas tablas. Esa tabla se puede identificar de forma única porque la primera celda, la primera columna, siempre tiene el texto “Resultados de laboratorio”.

Problema: el siguiente código funciona muy bien cuando hago cada archivo a la vez. Es decir, en lugar de hacer un bucle for sobre el directorio, apunto get_data = open () a un archivo específico. Sin embargo, quiero capturar los datos de los últimos años y preferiría no hacer cada archivo individualmente. Por lo tanto, utilicé el módulo glob y un bucle for para recorrer todos los archivos del directorio. El problema que tengo es que obtengo un MemoryError cuando llego al tercer archivo en el directorio.

La pregunta: ¿Hay alguna forma de borrar / restablecer la memoria entre cada archivo? De esa manera, podría pasar por todos los archivos del directorio y no pegar cada nombre de archivo individualmente. Como puede ver en el código siguiente, intenté borrar las variables con del, pero eso no funcionó.

Gracias.

from bs4 import BeautifulSoup import glob import gc for FileName in glob.glob("\\Research Results\\*"): get_data = open(FileName,'r').read() soup = BeautifulSoup(get_data) VerifyTable = "Clinical Results" tables = soup.findAll('table') for table in tables: First_Row_First_Column = table.findAll('tr')[0].findAll('td')[0].text if VerifyTable == First_Row_First_Column.strip(): v1 = table.findAll('tr')[1].findAll('td')[0].text v2 = table.findAll('tr')[1].findAll('td')[1].text complete_row = v1.strip() + ";" + v2.strip() print (complete_row) with open("Results_File.txt","a") as out_file: out_string = "" out_string += complete_row out_string += "\n" out_file.write(out_string) out_file.close() del get_data del soup del tables gc.collect() print ("done") 

Soy un progtwigdor muy principiante y me enfrenté al mismo problema. Hice tres cosas que parecían resolver el problema:

  1. También llame a la recolección de basura (‘gc.collect ()’) al comienzo de la iteración
  2. transforme el análisis en una iteración, de modo que todas las variables globales se conviertan en variables locales y se eliminen al final de la función.
  3. Utilice soupe.decompose ()

Creo que el segundo cambio probablemente lo resolvió, pero no tuve tiempo de comprobarlo y no quiero cambiar un código de trabajo.

Para este código, la solución sería algo como esto:

 from bs4 import BeautifulSoup import glob import gc def parser(file): gc.collect() get_data = open(file,'r').read() soup = BeautifulSoup(get_data) get_data.close() VerifyTable = "Clinical Results" tables = soup.findAll('table') for table in tables: First_Row_First_Column = table.findAll('tr')[0].findAll('td')[0].text if VerifyTable == First_Row_First_Column.strip(): v1 = table.findAll('tr')[1].findAll('td')[0].text v2 = table.findAll('tr')[1].findAll('td')[1].text complete_row = v1.strip() + ";" + v2.strip() print (complete_row) with open("Results_File.txt","a") as out_file: out_string = "" out_string += complete_row out_string += "\n" out_file.write(out_string) out_file.close() soup.decompose() gc.collect() return None for filename in glob.glob("\\Research Results\\*"): parser(filename) print ("done")