Lectura y escritura de archivos de datos experimentales con Python
Al finalizar este tema
Podrá leer archivos de texto y CSV con Python, filtrar los datos y guardar los resultados en un nuevo archivo.
¿Por qué es importante la entrada y salida de archivos?
Los datos experimentales son, en última instancia, archivos. Se exportan como CSV desde los equipos, se guardan los resultados del análisis en formato de texto y se comparten con otros investigadores mediante archivos. Aunque pueden abrirse en Excel, resulta difícil hacerlo manualmente cuando hay miles de muestras.
Al trabajar con archivos en Python, una tarea como extraer solo las muestras que cumplen ciertas condiciones de un archivo CSV de 10 000 líneas puede resolverse con solo cinco líneas de código.
Lectura de archivos de texto: open()
Es el método más básico para leer archivos en Python.
with open("protocol.txt", "r", encoding="utf-8") as f: content = f.read()
print(content)Palabras clave:
open("nombre_de_archivo", "modo")— Función para abrir archivos"r"— Modo de lectura (read)encoding="utf-8"— Para evitar errores de codificación (caracteres especiales)with ... as f:— Abre el archivo de forma segura y lo cierra automáticamente al finalizar el bloque
Si no se utiliza with, se debe llamar a f.close() manualmente. Al igual que se apaga el equipo tras un experimento, el archivo debe cerrarse tras su uso. with realiza esto de forma automática.
Resumen de modos de archivo
| Modo | Significado | Analogía |
|---|---|---|
"r" | Lectura (valor por defecto) | Abrir un cuaderno de notas para leer |
"w" | Escritura (sobrescribe el contenido existente) | Escribir en un cuaderno nuevo desde el principio |
"a" | Anexar (escribe al final del contenido existente) | Añadir información en la última página del cuaderno actual |
Tenga cuidado al usar el modo "w": el contenido del archivo original desaparecerá por completo. Para añadir información preservando los datos anteriores, utilice el modo "a".
Lectura línea por línea
Cuando desee procesar el archivo línea por línea:
with open("samples.txt", "r", encoding="utf-8") as f: for line in f: line = line.strip() if line: print(line)strip() elimina el carácter de fin de línea (\n) al final de cada línea. Si no se elimina, se mostrarán líneas en blanco al imprimir.
Lectura de archivos CSV
Los archivos CSV (valores separados por comas) son uno de los formatos estándar para los datos experimentales. Los datos exportados desde los dispositivos, los datos clínicos de TCGA y los datos descargados de NCBI se proporcionan en formato CSV.
sample_id,gene,expression,status
S001,EGFR,12.5,high
S002,TP53,3.2,low
S003,EGFR,18.7,high
S004,BRCA1,7.1,medium
S005,TP53,2.8,lowSe lee con el módulo csv de Python:
import csv
with open("expression_data.csv", "r", encoding="utf-8") as f: reader = csv.DictReader(f) for row in reader: print(f"{row['sample_id']}: {row['gene']} = {row['expression']}")csv.DictReader utiliza la primera fila (el encabezado) como clave para convertir cada fila en un diccionario. Esto permite acceder a los nombres de las columnas, lo que resulta muy práctico, como en row['gene'].
Filtrado condicional
"Quiero extraer solo el gen EGFR": basta con combinar bucles y sentencias condicionales:
import csv
egfr_samples = []
with open("expression_data.csv", "r", encoding="utf-8") as f: reader = csv.DictReader(f) for row in reader: if row["gene"] == "EGFR": egfr_samples.append(row)
print(f"Número de muestras EGFR: {len(egfr_samples)}")for sample in egfr_samples: print(f" {sample['sample_id']}: expression = {sample['expression']}")
assert len(egfr_samples) == 2En este tema se aplican todos los conceptos aprendidos anteriormente: for, if, append y f-string. La programación funciona de esta manera: los conocimientos se acumulan y se combinan.
Escritura de archivos CSV
Guarda los resultados filtrados en un archivo nuevo:
import csv
high_expression = [ {"sample_id": "S001", "gene": "EGFR", "expression": "12.5"}, {"sample_id": "S003", "gene": "EGFR", "expression": "18.7"},]
with open("egfr_high.csv", "w", encoding="utf-8", newline="") as f: writer = csv.DictWriter(f, fieldnames=["sample_id", "gene", "expression"]) writer.writeheader() writer.writerows(high_expression)
print("egfr_high.csv guardado correctamente")newline="" evita el problema de las líneas en blanco en Windows. También es recomendable incluirlo por costumbre en Mac/Linux.
Manejo de archivos TSV
TSV (valores separados por tabulaciones) es un archivo en el que los valores están separados por tabulaciones (\t). En bioinformática, se utiliza TSV con más frecuencia que CSV: datos de NCBI GEO, archivos BED, resultados de DEG, etc.
import csv
with open("deg_results.tsv", "r", encoding="utf-8") as f: reader = csv.DictReader(f, delimiter="\t") for row in reader: log2fc = float(row["log2FoldChange"]) pvalue = float(row["pvalue"]) if abs(log2fc) > 1.0 and pvalue < 0.05: print(f"{row['gene']}: log2FC={log2fc:.2f}, p={pvalue:.4f}")delimiter="\t" es todo lo que se necesita para que el código CSV se aplique directamente a TSV.
Inténtalo tú mismo (Ejemplo con guía)
Completa los espacios en blanco del siguiente ejemplo para escribir el código que filtre muestras de un archivo CSV según una condición específica.
importwith open("samples.csv", "r", encoding="utf-8") as f:reader = csv.Reader(f)for row in reader:od = float(row[""])if od > 1.0:print(f"{row['name']}: OD = {od}")
Errores comunes y soluciones
P: Se produce el error FileNotFoundError: No such file or directory
La ruta del archivo es incorrecta. Python interpreta las rutas relativas en función del directorio desde el que se ejecuta el script. Verifique con ls (terminal) si el archivo está en el directorio actual. En Google Colab, debe cargar el archivo desde la pestaña de archivos de la izquierda.
P: Al leer el CSV, los números aparecen como cadenas
csv.DictReader lee todos los valores como cadenas. Si necesita realizar operaciones numéricas, conviértalos a float(row["column"]) o int(row["column"]).
P: Los caracteres coreanos aparecen incorrectos
Es posible que haya omitido encoding="utf-8", o que el archivo esté guardado en otra codificación (por ejemplo, euc-kr). Al guardar desde Excel en coreano como CSV, a menudo se convierte a euc-kr. En ese caso, pruebe cambiando a encoding="euc-kr".
P: ¿Qué sucede si no se usa with en with open()?
Se puede abrir con f = open("file.txt"), pero si el programa se detiene por un error, el archivo no se cerrará. Al usar with, se cierra automáticamente incluso si ocurre un error. Es como apagar la fuente de alimentación del equipo después del experimento: with lo apaga automáticamente.