es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Bucle For y reemplazo de parte de una cadena en rutas basado en dos columnas de un dataframe en Python.

Intento iterar archivos de Excel en un directorio con el código siguiente:

import glob
import pandas as pd

files = glob.glob('./*.xlsx')

for file_path in files:
    print(file_path)

Salida:

./data\S273-2021-12-09.xlsx
./data\S357-2021-12-09.xlsx
./data\S545-2021-12-09.xlsx
./data\S607-2021-12-09.xlsx

Ahora quiero reemplazar S273, S357, etc. basado en el dataframe df para mapear old_name a new_name:

  old_name new_name
0     S273        a
1     S357        b
2     S545        c
3     S607        d
4     S281        e

Para convertir el dataframe en un diccionario si es necesario: name_dict = dict(zip(df.old_name, df.new_name))

El resultado esperado sería:

./data\a-2021-12-09.xlsx
./data\b-2021-12-09.xlsx
./data\c-2021-12-09.xlsx
./data\d-2021-12-09.xlsx

¿Cómo puedo lograrlo en Python? Agradezco sinceramente su ayuda.

EDICIÓN:

for file_path in files:
    for key, value in name_dict.items():
        if key in str(file_path):
            new_path = file_path.replace(key, value)
            print(new_path)

El código de arriba funciona, si es posible, se aceptan otras soluciones.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el cambio de nombre de los archivos según la asignación en el dataframe df, puedes utilizar un bucle for para iterar a través de la lista files y otro bucle for anidado para iterar a través del diccionario name_dict. Luego, utilizando el método replace() de las cadenas de texto, puedes reemplazar el nombre antiguo con el nuevo en la ruta del archivo. Así es como puedes modificar el código:

    import glob
    import pandas as pd
    
    # Definir el dataframe de asignación
    df = pd.DataFrame({'old_name': ['S273', 'S357', 'S545', 'S607', 'S281'],
                       'new_name': ['a', 'b', 'c', 'd', 'e']})
    
    # Convertir el dataframe en un diccionario
    name_dict = dict(zip(df.old_name, df.new_name))
    
    # Listar todos los archivos xlsx en el directorio actual
    files = glob.glob('./*.xlsx')
    
    # Iterar a través de cada ruta de archivo
    for file_path in files:
        # Iterar a través de cada par clave-valor del diccionario
        for key, value in name_dict.items():
            # Verificar si el nombre antiguo existe en la ruta del archivo
            if key in file_path:
                # Reemplazar el nombre antiguo con el nuevo en la ruta del archivo
                new_path = file_path.replace(key, value)
                # Imprimir la nueva ruta del archivo
                print(new_path)
    

    Esto imprimirá las nuevas rutas de los archivos con el nombre antiguo reemplazado por el nuevo. Si deseas realmente cambiar el nombre de los archivos, puedes utilizar la función os.rename():

    import os
    
    # Iterar a través de cada ruta de archivo
    for file_path in files:
        # Iterar a través de cada par clave-valor del diccionario
        for key, value in name_dict.items():
            # Verificar si el nombre antiguo existe en la ruta del archivo
            if key in file_path:
                # Reemplazar el nombre antiguo con el nuevo en la ruta del archivo
                new_path = file_path.replace(key, value)
                # Renombrar el archivo
                os.rename(file_path, new_path)
    

    Esto cambiará el nombre de los archivos con el nombre antiguo reemplazado por el nuevo en el directorio.

Comments are closed.