Escribí una función para extraer de archivos de texto con expresiones regulares. La función devuelve cada variable. Tengo muchos archivos y quiero iterar sobre los archivos y agregar los resultados. Cada variable es una lista; Los combinaré para crear un DF. Esto tambien funciona.

Entiendo que hay un problema, pero tengo problemas para implementar. Lo he usado para listas de directorios / archivos en el pasado. He estado buscando / leyendo mucho, pero claramente me falta algo obvio.

Escribí la función y he usado glob para enumerar nombres de archivos antes. Sé de list.append, pero no estoy seguro de cómo combinarlo con glob (o similar).

¿Cómo puedo iterar sobre los archivos, llamar a esta función y agregar los resultados después de cada iteración?

TEXTO:

A bunch of sentences
CUSTOMER: 78787
amount (500 dollars)
A bunch of sentences

CÓDIGO

def find(customer, amount):    
    with open(r"file.txt",'r') as myfile:
        text = myfile.read() 

    customer = re.findall(r"^CUSTOMER:[\s](.*)\d+", text) 
    amount = re.findall(r'\((.*?)\)', text)

    return customer, amount

La función funciona, pero solo para el único archivo actualmente leído.

0
Ethe99 27 jun. 2019 a las 21:46

1 respuesta

La mejor respuesta

Simplemente recorra la lista de archivos generados con su función. Además, no tiene sentido pasar customer o amount. Simplemente se crean en tiempo de ejecución de su función find y persisten después de que se devuelven.

Puede usar el método pathlib.Path s glob. Aquí va:

from pathlib import Path

def find(file_name):    
    with open(file_name,'r') as f:
        text = f.read() 

    customer = re.findall(r"^CUSTOMER:[\s](.*)\d+", text) 
    amount = re.findall(r'\((.*?)\)', text)

    return customer, amount

file_dir = Path("path_to_directory_containing_files") # CHANGE THIS
all_files = file_dir.glob("*.txt") # this should be whatever pattern that matches all the input files
results = [find(f) for f in all_files]
1
Alex Ding 27 jun. 2019 a las 19:07