¿Qué es un archivo FASTA?
FASTA es un formato de texto sencillo para guardar una o varias secuencias, cada una con su nombre. Casi todas las herramientas de bioinformática lo leen, así que saber leerlo con Python es una destreza básica.
Un archivo FASTA es texto plano. Cualquier editor lo abre, y un programa corto lo separa en nombres y secuencias.
Al final de esta lección
Nota
Puedo leer las secuencias de un texto en formato FASTA y guardarlas con su nombre.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| FASTA | un formato de texto con nombres y secuencias | |
| Registro | un nombre con su secuencia | |
| Cabecera | la línea que empieza por el signo > y da el nombre | >sec1 muestra inventada |
| Línea partida | una secuencia larga repartida en varias líneas | |
| Diccionario | una colección de pares: una clave y su valor |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un registro FASTA tiene cabecera y secuencia
Cada registro empieza con una cabecera: una línea que empieza por >. Después del signo viene el nombre, y puede seguir una descripción.
Las líneas siguientes son la secuencia. Un registro termina donde empieza la siguiente cabecera, o donde acaba el archivo.
Ejemplo resuelto: un archivo FASTA de dos registros
| Línea | Texto | Qué es |
|---|---|---|
| 1 | >sec1 muestra inventada | Cabecera del primer registro |
| 2 | ACGTAC | Primera parte de la secuencia 1 |
| 3 | GGTT | Segunda parte de la secuencia 1 |
| 4 | >sec2 | Cabecera del segundo registro |
| 5 | TTGCA | Secuencia 2, en una sola línea |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Saca el nombre de una cabecera
docker exec jupyter python3 -c "t='>sec1 muestra inventada\nACGTAC\nGGTT\n'; print(t.split('\n')[0][1:].split()[0])"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
El texto se separa en líneas con split
Un archivo se lee como un texto con saltos de línea. text.split("\n") lo parte en una lista de líneas.
Si el texto acaba con un salto de línea, la última pieza de la lista es una cadena vacía. Un programa que lee FASTA tiene que saltarse esas líneas vacías.
Mira las líneas de un texto FASTA
docker exec jupyter python3 -c "t='>sec1\nACGTAC\nGGTT\n>sec2\nTTGCA\n'; print(t.split('\n'))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cuenta los registros por sus cabeceras
docker exec jupyter python3 -c "t='>sec1\nACGTAC\nGGTT\n>sec2\nTTGCA\n'; print(t.count('>'), len(t.split('\n')))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Se leen los registros línea a línea
El programa recorre las líneas y guarda en una variable el nombre del registro actual. Si la línea empieza por >, abre un registro nuevo con una secuencia vacía.
Si no, y la línea no está vacía, la pega al final de la secuencia actual. Así las líneas partidas se unen solas.
Lee un texto FASTA a un diccionario
text = ">sec1 muestra inventada\nACGTAC\nGGTT\n>sec2\nTTGCA\n"
records = {}
name = ""
for line in text.split("\n"):
if line.startswith(">"):
name = line[1:].split()[0] # el nombre es la primera palabra
records[name] = ""
elif line != "":
records[name] = records[name] + line
for name in records:
print(name, len(records[name]), records[name])
# Cambia el texto: añade una tercera secuencia inventada y ejecuta de nuevo.
Ejemplo resuelto: lo que guarda el diccionario
| Nombre | Líneas del archivo | Secuencia guardada | Longitud |
|---|---|---|---|
| sec1 | ACGTAC y GGTT | ACGTACGGTT | 10 |
| sec2 | TTGCA | TTGCA | 5 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Calcula la longitud de cada registro
docker exec jupyter python3 -c "t='>sec1 muestra inventada\nACGTAC\nGGTT\n>sec2\nTTGCA\n'; print([(x.split('\n')[0].split()[0], len(''.join(x.split('\n')[1:]))) for x in t.split('>')[1:]])"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error muy común
Advertencia
Mucha gente cree que cada línea del archivo es una secuencia entera. No siempre: una secuencia larga se reparte en varias líneas. La línea con el signo > es el nombre, no una secuencia. Las líneas de debajo se pegan hasta la siguiente cabecera.
Para ir más lejos: el registro más largo
Con el diccionario que devuelve tu función, busca el registro más largo. Escribe un bucle que recorra los nombres y guarde el mayor. ¿Qué haces si dos registros empatan? Decide una regla y escríbela en un comentario.