Script de Python para eliminar líneas de texto vacias o que no tengan 7 veces el carácter "|" en ficheros *.log

El macro de YASARA Structure para hacer docking, genera líneas de texto adicionales a los resultados que son molestas cuando importas todos esos datos en un fichero Excel. El siguiente script de Python elimina toda esa información y las líneas en blanco y deja sólo los resultados de docking:

Lig.|Effi[kcal/(mol*Atom)]|Bind.energy[kcal/mol]|Dissoc. constant [pM]| Con.Surf[A^2] |
Name | Contacting receptor residues | SMILES

# -*- coding: utf-8 -*-

# Este script limpia (elimina de los ficheros *.log generados por YASARA docking) todas las
# líneas de texto vacias o que no tengan 7 veces el carácter "|", que es el sepador de los
# resultados de docking Lig.|Effi[kcal/(mol*Atom)]|Bind.energy[kcal/mol]|Dissoc. constant [pM]|
#  Con.Surf[A^2] | Name | Contacting receptor residues | SMILES

import os
import re

# Ruta donde se encuentran los archivos
# ruta = "/home/jant.encinar/" para trabajar en Linux
ruta = r"D:\aaa"

# Patrón para buscar los archivos con extensión .log
patron_archivo = re.compile(r'.*\.log$')

# Cadenas de inicio y fin
cadena_inicio = "----+---------------------+---------------------+---------------------+---------------+------+------------------------------+-------------------------"
cadena_fin = "The random seed used during docking was 0."

# Función para procesar los archivos
def procesar_archivo(ruta_archivo):
    with open(ruta_archivo, 'r', encoding='utf-8') as f:
        lineas = f.readlines()
    
    # Variables para controlar la sección de interés
    en_seccion_interes = False
    lineas_procesadas = []
    
    for linea in lineas:
        # Comenzar a procesar cuando se encuentre la cadena de inicio
        if cadena_inicio in linea:
            en_seccion_interes = True
            lineas_procesadas.append(linea)
            continue
        
        # Dejar de procesar cuando se encuentre la cadena de fin
        if cadena_fin in linea:
            en_seccion_interes = False
            lineas_procesadas.append(linea)
            continue
        
        # Si estamos en la sección de interés, procesar las líneas
        if en_seccion_interes:
            # Eliminar líneas vacías
            if linea.strip() == '':
                continue
            
            # Eliminar líneas que no contengan el carácter "|" repetido 7 veces
            if linea.count('|') < 7:
                continue
        
        # Añadir la línea procesada a la lista de líneas procesadas
        lineas_procesadas.append(linea)
    
    # Escribir el contenido procesado de nuevo en el archivo
    with open(ruta_archivo, 'w', encoding='utf-8') as f:
        f.writelines(lineas_procesadas)

# Recorrer los archivos en la ruta especificada
for root, dirs, files in os.walk(ruta):
    for file in files:
        if patron_archivo.match(file):
            ruta_archivo = os.path.join(root, file)
            procesar_archivo(ruta_archivo)

print("Proceso completado.")





Última modificación: