Asunto raro con el patrón de nombre de archivo emparejando

Estoy tratando de bucle a través de varios archivos en una carpeta, fusionar los archivos similares en un solo marco de datos, y luego empujar ese objeto a una tabla en SQL Server. Tengo el código funcionando bien, porque si los archivos en una carpeta son todos similares, pero si los archivos son diferentes, no funciona. Quiero hacer que el patrón coincida, basado en nombres de archivos, y fusionar esos archivos similares en un marco de datos, y finalmente, empujar ese objeto a una tabla en SQL Server. Entonces, necesito ir al siguiente conjunto de archivos y hacer lo mismo. Aquí está mi código. Creo que está cerca, pero algo no está bien aquí.

import urllib
import pyodbc
import pandas as pd
import os, glob
from pandas import DataFrame
import os, glob
import pandas as pd

list = ['FFIEC CDR Call Bulk POR',
        'FFIEC CDR Call Schedule CI',
        'FFIEC CDR Call Schedule ENT',
        'FFIEC CDR Call Schedule GCI',
        'FFIEC CDR Call Schedule GI']

for item in list:
    
    path = "C:\\Users\\ryans\\OneDrive\\Desktop\\schemas\\"
    
    fullpath = path + item + '*'
    print(fullpath)
    all_files = glob.glob(os.path.join(fullpath, "*.txt"))
    print(all_files)
    
    all_df = []
    for f in all_files: 
       df = pd.read_csv(f, delimiter='\t', skiprows=1) 
       df['thefile'] = os.path.basename(f)
       all_df.append(df) 
    
    df_append = pd.concat(all_df, ignore_index=True, sort=True)
    my_list = list(df_append)
    
    # convert the list to a data frame
    df_append = DataFrame(df_append)
    df_append.shape
    
    df_append.columns = df_append.columns.str.replace(',', '')
    df_append.columns = df_append.columns.str.replace('(', '')
    df_append.columns = df_append.columns.str.replace(')', '')
    df_append.columns = df_append.columns.str.replace(' ', '_')
    df_append.columns = df_append.columns.str.replace('.', '_')
    df_append.columns = df_append.columns.str.replace('-', '_')
    df_append.columns = df_append.columns.str.replace('/', '_')
    df_append.columns = df_append.columns.str.replace('&', '_')
    df_append.columns = df_append.columns.str.replace(':', '')
    
    # load to DB table
    engine = "mssql+pyodbc://Server_Name/DB_Name?driver=SQL Server Native Client 11.0?trusted_connection=yes"
    df_append.to_sql(item, engine, index=False, if_exists='append')

Cuando imprimí la variable 'fullpath', obtengo este tipo de resultado.

C:\Users\ryans\OneDrive\Desktop\schemas\FFIEC CDR Call Subset of Schedules 3*

El primer conjunto de nombres de archivos se ven así: FFIEC CDR Call Bulk POR 03312001.txt FFIEC CDR Call Bulk POR 03312002.txt etc.

El próximo set parece esto. FFIEC CDR Programación CI 03312001.txt FFIEC CDR Programación CI 03312002.txt

Hay más de 400 archivos aquí, así que quiero hacer esto de alguna manera automatizada. ¡Gracias!

Pregunta hecha hace 3 años, 5 meses, 0 días - Por techinnovator


2 Respuestas:

  • El problema que estás enfrentando es que el patrón que estás utilizando para hacer coincidir los nombres de archivo no está funcionando correctamente. En la variable fullpath, estás agregando un asterisco (<strong>) al final del nombre del archivo, pero esto puede no estar dando el resultado esperado.

    En lugar de utilizar un patrón genérico con el asterisco, te recomendaría que utilices una expresión regular para hacer coincidir los nombres de archivo basados en un patrón específico que contenga parte del nombre de archivo esperado. Por ejemplo, podrías construir el patrón de la siguiente manera:

    python
    import re
    
    

    Definir el patrón para los nombres de archivo

    pattern = re.compile(item + r'\s\d+\.txt')

    Buscar los archivos que coincidan con el patrón

    all_files = [f for f in glob.glob(os.path.join(path, ".txt")) if pattern.match(os.path.basename(f))]

    En este caso, el patrón generado se basa en el nombre de archivo item que estás recorriendo en tu lista, seguido de un espacio y luego un número seguido de .txt. Esto debería ayudar a seleccionar solo los archivos que coincidan con este patrón específico.

    Inténtalo con este ajuste y verifica si ahora puedes seleccionar correctamente los archivos que deseas procesar. Si tienes más preguntas o necesitas más ayuda, házmelo saber. ¡Buena suerte!

    Respondida el Dec 18, 2020 a las 03:58 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El código que has proporcionado funciona bien para fusionar archivos similares en un solo marco de datos y luego insertarlos en una tabla de SQL Server. Sin embargo, el problema parece estar en el patrón de coincidencia de nombres de archivo para identificar archivos similares.

    En tu código, estás utilizando glob.glob(os.path.join(fullpath, "<strong>.txt")) para obtener todos los archivos .txt en el directorio especificado por fullpath. Sin embargo, el patrón </strong>.txt coincidirá con todos los archivos .txt, independientemente de su nombre de archivo.

    Para hacer coincidir archivos basados en un patrón de nombre de archivo específico, necesitas modificar el patrón <strong>.txt para incluir el nombre de archivo deseado. Por ejemplo, si quieres hacer coincidir todos los archivos que contienen "FFIEC CDR Call Bulk POR" en su nombre de archivo, puedes utilizar el siguiente patrón:

    
    fullpath = path + "FFIEC CDR Call Bulk POR"
    

    Esto hará que fullpath sea igual a:

    
    C:\Users\ryans\OneDrive\Desktop\schemas\FFIEC CDR Call Bulk POR
    

    Ahora, cuando utilices glob.glob(os.path.join(fullpath, "</strong>.txt")), solo coincidirá con los archivos que contienen "FFIEC CDR Call Bulk POR" en su nombre de archivo.

    Aquí está el código modificado con el patrón de coincidencia actualizado:

    python
    import urllib
    import pyodbc
    import pandas as pd
    import os, glob
    from pandas import DataFrame
    import os, glob
    import pandas as pd
    
    list = ['FFIEC CDR Call Bulk POR',
            'FFIEC CDR Call Schedule CI',
            'FFIEC CDR Call Schedule ENT',
            'FFIEC CDR Call Schedule GCI',
            'FFIEC CDR Call Schedule GI']
    
    for item in list:
    
        path = "C:\\Users\\ryans\\OneDrive\\Desktop\\schemas\\"
    
        

    Modificar el patrón para hacer coincidir archivos basados en el nombre de archivo

    fullpath = path + item + '' print(fullpath) all_files = glob.glob(os.path.join(fullpath, ".txt")) print(all_files) all_df = [] for f in all_files: df = pd.read_csv(f, delimiter='\t', skiprows=1) df['thefile'] = os.path.basename(f) all_df.append(df) df_append = pd.concat(all_df, ignore_index=True, sort=True) my_list = list(df_append)

    convert the list to a data frame

    df_append = DataFrame(df_append) df_append.shape df_append.columns = df_append.columns.str.replace(',', '') df_append.columns = df_append.columns.str.replace('(', '') df_append.columns = df_append.columns.str.replace(')', '') df_append.columns = df_append.columns.str.replace(' ', '_') df_append.columns = df_append.columns.str.replace('.', '_') df_append.columns = df_append.columns.str.replace('-', '_') df_append.columns = df_append.columns.str.replace('/', '_') df_append.columns = df_append.columns.str.replace('&', '_') df_append.columns = df_append.columns.str.replace(':', '')

    load to DB table

    engine = "mssql+pyodbc://Server_Name/DB_Name?driver=SQL Server Native Client 11.0?trusted_connection=yes" df_append.to_sql(item, engine, index=False, if_exists='append')

    Con este cambio, el código ahora debería coincidir con los archivos basados en su nombre de archivo y fusionarlos en consecuencia.

    Respondida el Dec 18, 2020 a las 04:10 - por Gemini

    Votos positivos: 0 | Votos negativos: 0