Biblioteca con scripts sencillos de Python

Scripts de Python 3 para analizar los datos de RMSD de muchas simulaciones de dinámica molecular con YASARA structure, generando un fichero de texto tabulado, con tantas columnas como el número de simulaciones analizadas.

Tendrás que editar el script y cambiar la ruta de la carpeta raíz que deseas analizar, en mi caso "/home/jant.encinar/py-linux/06_analysis-tab/tab/".

En esta ruta el script encuentra los archivos cuyo nombre termina en "_bindenergy.tab", elimina saltos de línea y divide por espacios en blanco, creando un fichero con el mismo nombre pero con extensión TXT, y dejando los datos en columnas separadas por tabuladores.

import os

# Directorio donde se encuentran los archivos de entrada que terminan en "_bindenergy.tab"
# este script elimina saltos de línea y divide por espacios en blanco, creando un fichero
# con el mismo nobre pero extensión TXT, y dejando columnas separadas por tabuladores.
# El script se llama "07_tab-to-txt.py"
input_dir = '/home/jant.encinar/py-linux/06_analysis-tab/tab/'

# Obtener lista de archivos que terminan en "_analysis.tab"
input_files = [f for f in os.listdir(input_dir) if f.endswith('_analysis.tab')]

# Recorrer cada archivo de entrada
for input_file in input_files:
    # Abrir archivo de entrada y archivo de salida
    with open(os.path.join(input_dir, input_file), 'r') as f_in, \
            open(os.path.join(input_dir, input_file.replace('.tab', '.txt')), 'w') as f_out:
        
        # Recorrer cada línea del archivo de entrada
        for line in f_in:
            # Eliminar saltos de línea y dividir por espacios en blanco
            values = line.strip().split()
            # Escribir los valores separados por tabuladores en el archivo de salida
            f_out.write('\t'.join(values) + '\n')

El siguiente script usa como información de entrada los ficheros "_analysis.txt", que hemos hecho con el script anterior, y nos devuelve dos ficheros de texto: "007-glue-like-FAS_ana.txt" y "007-glue-like-FAS_ana-reves.txt". Este último tiene la información con los valores de RMSD en columnas para todas las simulaciones analizadas. Se importa con facilidad en un fichero Excel.

import os

directory = "/home/jant.encinar/py-linux/06_analysis-tab/tab/"
output_file_path = "/home/jant.encinar/py-linux/06_analysis-tab/007-glue-like-FAS_ana.txt"

files = [f for f in os.listdir(directory) if f.endswith("_analysis.txt")]
files.sort()  # Ordenar por orden alfabético

with open(output_file_path, "w") as output_file:
    for filename in files:
        file_path = os.path.join(directory, filename)
        with open(file_path, "r") as input_file:
            lines = input_file.readlines()
            if len(lines) < 2:
                print(f"El archivo {filename} está vacío.")
                continue
            columns = [line.strip().split("\t")[-2] for line in lines[1:] if len(line.strip().split("\t")) >= 2]
            if len(columns) == 0:
                print(f"El archivo {filename} no tiene la columna adecuada.")
                continue
            output_file.write("{}\t{}\n".format(filename, '\t'.join(columns)))


# segunda parte...
import os

# Ruta del archivo de entrada y salida
input_file = '/home/jant.encinar/py-linux/06_analysis-tab/007-glue-like-FAS_ana.txt'
output_file = '/home/jant.encinar/py-linux/06_analysis-tab/007-glue-like-FAS_ana-reves.txt'

# Abre el archivo de entrada y lee todas las líneas
with open(input_file, 'r') as f_in:
    lines = f_in.readlines()

# Trasponer las líneas
transpose_lines = []
for i in range(len(lines[0].split())):
    row = []
    for line in lines:
        row.append(line.split()[i])
    transpose_lines.append('\t'.join(row) + '\n')

# Escribe las líneas transpuestas en el archivo de salida
with open(output_file, 'w') as f_out:
    f_out.writelines(transpose_lines)

# Imprime mensaje de éxito
print(f"Archivo {output_file} generado exitosamente.")

Podemos considerar una opción más sencilla en la que juntemos en un solo fichero de texto los contenidos de una columna con los datos de interés, procedente de múltiples ficheros *.tab generados por YASARA después de ejecutar los macros md_analysis.mcr o md_bindenergy.mcr.

El fichero de salida que genera el script es de texto y tienen tantas columnas como ficheros *.tab encuentre en la ruta que marqueños. La primera fila de cada columna tiene el nombre del fichero *.tab del cual fue extraída la información de cada columna. Resulta muy cómodo ejecutar estos scripts en Visual Studio code como un archivo compatible con Jupyter Notebook.

Cuidado con la línea 22, en este ejemplo añade un signo "-" a cada dato de la columna que rescata. Si borramos este signo, tomará los datos de la columna "VINALS" de tantos ficheros ".tab" encuentre en la ruta "D:\aaa" y los colocará en la ruta/fichero "D:\aaa\_todas-columnas_VINALS.txt"

import os
import pandas as pd

def leer_archivos_y_extraer_columna(ruta_entrada, extension):
    # Diccionario para almacenar los datos de la columna "VINALS" por archivo
    datos_por_archivo = {}
    # Lista para almacenar los nombres de los archivos
    nombres_archivos = []
    
    # Recorremos los archivos en la ruta de entrada
    for archivo in os.listdir(ruta_entrada):
        # Verificamos si el archivo tiene la extensión deseada
        if archivo.endswith(extension):
            # Construimos la ruta completa al archivo
            ruta_completa = os.path.join(ruta_entrada, archivo)
            try:
                # Leemos el archivo y almacenamos la columna "VINALS" en el diccionario
                df = pd.read_csv(ruta_completa, sep='\t')
                if "VINALS" in df.columns:
                    # Añadimos el prefijo "-" a cada valor en la columna "VINALS"
                    # df["VINALS"] = "-" + df["VINALS"].astype(str)
                    df["VINALS"] = "-" + df["VINALS"].astype(str)
                    datos_por_archivo[archivo] = df["VINALS"]
                    nombres_archivos.append(archivo)
                else:
                    print(f"La columna 'VINALS' no existe en el archivo '{archivo}'.")
                    print(f"Saltando este archivo.")
            except Exception as e:
                print(f"No se pudo leer el archivo '{archivo}': {e}")
    
    return datos_por_archivo, nombres_archivos

def guardar_a_archivo(datos_por_archivo, nombres_archivos, ruta_salida):
    # Creamos un DataFrame a partir del diccionario de datos
    df_resultado = pd.DataFrame(datos_por_archivo)
    # Reemplazamos los encabezados de columna por los nombres de archivo correspondientes
    df_resultado.columns = nombres_archivos
    # Guardamos el DataFrame en un archivo separado por tabuladores
    df_resultado.to_csv(ruta_salida, sep='\t', index=False)

# Rutas de entrada y salida
ruta_entrada = r"D:\aaa"
ruta_salida = r"D:\aaa\_todas-columnas_VINALS.txt"

# Extensión de los archivos a leer
extension = ".tab"

# Leemos los archivos y extraemos los valores de la columna "VINALS"
datos_por_archivo, nombres_archivos = leer_archivos_y_extraer_columna(ruta_entrada, extension)
if datos_por_archivo:
    # Si se encontraron datos, los guardamos en el archivo de salida
    guardar_a_archivo(datos_por_archivo, nombres_archivos, ruta_salida)
    print("Proceso completado. Se ha generado el archivo de salida en:", ruta_salida)
else:
    print("No se encontraron datos para procesar.")

La versión para Windows del primer script que crea un fichero con tabuladores dentro de ficheros de texto en columnas separadas por espacios se muestra a continuación.

import os

def process_files(directory):
    # Itera sobre los archivos en el directorio dado
    for filename in os.listdir(directory):
        if filename.endswith('.tab'):
            file_path = os.path.join(directory, filename)
            with open(file_path, 'r') as file:
                lines = file.readlines()
            
            # Procesa cada línea
            new_lines = []
            for line in lines:
                # Divide la línea en columnas por espacios
                columns = line.strip().split()
                # Une las columnas con tabuladores
                new_line = '\t'.join(columns) + '\n'
                new_lines.append(new_line)
            
            # Escribe las líneas modificadas de vuelta al archivo
            with open(file_path, 'w') as file:
                file.writelines(new_lines)

if __name__ == "__main__":
    # Directorio donde se encuentran los archivos
    directory = r"D:\aaa"
    
    # Procesa los archivos en el directorio
    process_files(directory)




Última modificación: