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.")