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.

Python: ¿Cómo puedo escribir un archivo de texto que extraiga datos de un archivo de Excel? Formatear como “Encabezado de columna: Valor de celda”

Estoy tratando de automatizar la salida de un archivo de Excel para que sea más fácilmente legible. Tengo un archivo de Excel con columnas A hasta BY. Mi plan es leer cada fila con una fecha que coincida con la entrada del usuario. Luego leer cada celda de la fila y, si la celda no está en blanco, imprimir el valor de la celda. Después de esto, los datos se escribirán en un archivo de texto en el siguiente formato:


  • Nombre
  • Encabezado de columna C: valor de la celda
  • Encabezado de columna K: valor de la celda
  • Encabezado de columna Z: valor de la celda

  • Nombre 2
  • Encabezado de columna C: valor de la celda
  • etc.

“Nombre” es una de las columnas. Entonces creo que la idea sería crear un diccionario de nombres, donde cada nombre tenga un diccionario anidado de cada encabezado de columna y su valor.

Estoy utilizando openpyxl para completar esta tarea. Puedo recorrer correctamente todas las filas y celdas que cumplen los criterios. Sin embargo, tengo problemas para convertir esto en un archivo de texto con el formato que me interesa usar. ¿Alguien puede proporcionar algunos métodos para imprimir los valores de las celdas y los encabezados de columna correspondientes utilizando un bucle for para todas las columnas? ¿Y también en el formato deseado? Estoy dispuesto a proporcionar cualquier otra información que se necesite. Gracias a cualquiera que pueda ayudar. Esta también es mi primera publicación, así que avíseme cómo más puedo ayudar.

EDIT: Añadí parte del código que usé para recorrer las columnas y filas. “work date” es el valor de entrada del usuario que elige solo las filas con la fecha correcta con la que queremos trabajar.

Recorrer cada fila con la fecha dada e imprimir las celdas con valor en ellas

cards = {}
activity_list = []
for row in active_sheet.iter_rows(max_row=22):
    if row[0].value == work_date:
        cards[row[1].value] = ['Start']
        for cell in row:
            if cell.value:
                activity_list.append(cell.value)
                for key, value in cards.items():
                    cards[key].append(activity_list)
    else:
        continue

Aquí seleccionamos solo las filas con la fecha correcta e imprimimos solo las celdas relevantes y no vacías. Y se imprimen y formatean en un archivo de texto.

with open(timecardtxt, 'w') as file_object:
    for key, values in cards.items():
        file_object.write("Nombre: " + key)
        for item in value[1]:
            print(item, file=file_object)
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para imprimir los valores de las celdas y el encabezado de columna correspondiente utilizando un bucle for para todas las columnas, puedes usar el paquete openpyxl para iterar sobre cada encabezado de columna y valor de celda en cada fila que coincida con la fecha ingresada por el usuario. Luego, puedes almacenar los datos en un diccionario con diccionarios anidados para cada nombre y su correspondiente encabezado de columna y valor de celda. Finalmente, puedes escribir los datos en un archivo de texto en el formato deseado utilizando formato de cadena.

    Aquí tienes un ejemplo de código para lograr esto:

    import openpyxl
    
    # especifica la fecha ingresada por el usuario
    work_date = "2021-01-01"
    
    # carga el archivo de Excel
    wb = openpyxl.load_workbook("nombre_archivo.xlsx")
    active_sheet = wb.active
    
    # inicializa el diccionario para almacenar los datos
    cards = {}
    
    # itera sobre las filas con fecha coincidente y almacena los datos relevantes en el diccionario
    for row in active_sheet.iter_rows(min_row=2, max_col=62):
        if row[0].value == work_date:
            name = row[1].value
            cards[name] = {}
            for i, cell in enumerate(row):
                if cell.value:
                    # obtén el encabezado de columna y el valor de celda para celdas no vacías
                    col_header = active_sheet.cell(row=1, column=i+1).value
                    cell_value = cell.value
                    # almacena los datos en el diccionario
                    cards[name][col_header] = cell_value
        else:
            continue
    
    # escribe los datos en un archivo de texto en el formato deseado
    with open("output.txt", "w") as f:
        for name, data in cards.items():
            f.write("- {}\n".format(name))
            for col_header, cell_value in data.items():
                f.write("- {} : {}\n".format(col_header, cell_value))
            f.write("\n")
    

    Este código iterará sobre cada fila con una fecha coincidente, extraerá el encabezado de columna y el valor de celda para cada celda no vacía, y almacenará los datos en un diccionario con diccionarios anidados para cada nombre y su correspondiente encabezado de columna y valor de celda. Luego, escribirá los datos en un archivo de texto con el formato deseado, utilizando formato de cadena para asegurar un espaciado y formato adecuados.

Comments are closed.