class: center, middle, inverse, title-slide # Python II y GitHub ### Licenciatura en Ciencias Genómicas,UNAM ### First version: yyy-mm-dd; Last update: 2022-03-16 --- <style type="text/css"> /* From https://github.com/yihui/xaringan/issues/147 */ .scroll-output { height: 80%; overflow-y: scroll; } /* https://stackoverflow.com/questions/50919104/horizontally-scrollable-output-on-xaringan-slides */ pre { max-width: 100%; overflow-x: scroll; } </style> ## Objetivo * Comprender como pasar valores a un programa a través de pedirselos al usuario o usando archivos. __Contenido de la unidad__ 1. Pidiendo datos al usuario desde la terminal 2. Pidiendo datos usando archivos --- # Resumen Hasta ahora sabemos que: - Un _dato_ es un valor y hay de distintos tipos, enteros, flotantes, cadenas, etc. -- - Todo _dato_ en python es un __objeto__ -- - Un objeto tiene 3 caracteristicas: un identificador, un tipo y un valor. -- - Cada tipo de objeto tiene _funcionalidades_ definidas por python que podemos usar, y se le conocen como __métodos__. -- - Existen otras funcionalidades implementadas en python que podemos usar y que no estan vinculadas directamente a los objetos, estas se llaman __funciones__. -- - una __variable__ es en realidad una referencia a un objeto, y por lo tanto tiene un identificador, un tipo y un valor. -- Hasta ahora, hemos usado datos dentro de nuestro programa, utilizando variables y hacendo operaciones con ellas, pero si quiero contar los nucleotidos de otra secuencia, tengo que entrar al programa y modificar el valor de la variable. --- # ¿Cómo cambiar el input? Pasarle el valor al script permite no tener que modificar el código cada vez que se cambia dicha variable. <img src="https://assets.spe.org/dims4/default/7536b25/2147483647/strip/true/crop/739x473+0+0/resize/800x512!/quality/90/?url=http%3A%2F%2Fspe-brightspot.s3.amazonaws.com%2Fb2%2F2e%2Fb5d9f53904e8784805d72ffe9516%2Fgettyimages-1138383136.jpg" width="600px" style="display: block; margin: auto;" /> --- # ¿Cómo cambiar el input? Dar una variable al script permite no tener que modificar el código cada vez que se cambia dicha variable. -- Existen varias formas de hacerlo: -- - `ìnput()`: Esta función nos permite pasar el valor directo a una variable -- - `open()`: Leyendo archivos -- - *Argumentos*: Pasando argumentos al archivo --- class: inverse, center, middle # `input()` --- # `input()` Con la función `ìnput()` podemos pedir el dato al usuario desde terminal -- ```python dna = input() print('La secuencia de DNA es: {dna}') ``` -- <br><br> .center[.content-box-green[**Vamos a vsCode**]] --- ## Ejercicio para entregar .content-box-blue[ Utilizando el problema de: ¿Cuantas `A`, `C`, `G` y `T` hay en la secuencia? Cambia tu script para que la secuencia se la des sin tener que modificar tu programa cada vez que quieras dar una secuencia diferente .tiny[ `dna = 'AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC'` ] ] -- .content-box-blue[ Además agrega un mensaje para pedir la secuencia ] Trata mas tarde, de resolverlo también en [Rosalind: Counting DNA Nucleotides](http://rosalind.info/problems/dna/) --- ## Ejercicio de Rosalind Si terminas, puedes hacer el siguiente ejercicio. .content-box-blue[ Hacer el ejercico de [Rosalind:Transcribing DNA into RNA](http://rosalind.info/problems/rna/) ] --- class: inverse, center, middle # `open()`: Leyendo archivos --- # `open()`: Leyendo archivos Podemos leer archivos de texto y usar estos como *Input*. <img src="img/readpy.png" width="700px" style="display: block; margin: auto;" /> --- # `open()`: Leyendo archivos Podemos leer archivos de texto y usar estos como *Input*. ## Biología En Bioinformática tenemos varios formatos de archivos de **texto** que necesitaremos leer. Ejemplos: -- - Archivos `FASTA` de DNA o proteínas -- - Archivos `FASTAQ` con secuencias de DNA -- - Archivos de salida de programas (eg. BLAST) -- - Archivos `HTML` -- - Otros... --- ## Archivos Binarios Archivos que contienten bytes <img src="https://edteam-media.s3.amazonaws.com/community/original/f660e5be-b0ca-436c-b77e-44fd49a07148.jpg" width="500px" style="display: block; margin: auto;" /> -- - A demás de los archivos comprimidos (eg. `ZIP files`) --- class: inverse, center, middle # Directorio de trabajo --- # Directorio de trabajo Recuerda nuestra estructura de directorios del curso ``` . ├── data ├── docs ├── results └── src ``` src: donde colocamos los scripts o programas results: archivos de salida resultado de ejecutar los scripts data: archivos de datos usados para correr nuestros programas .content-box-blue[ El uso correcto de los paths es esencial para que nuestros programas corran. El comando pwd de unix te servirá para saber donde estas parado. ] --- class: inverse, center, middle # `open()`: Leyendo archivos --- ## Leer un archivo - Primero, tenemos que acceder a él usando `open()`. Se necesita como argumento el nombre del archivo de **texto** que deseamos leer. -- ```python my_file = open("dna.txt") ``` .content-box-blue[ Tip: Recuerda que el nombre del archivo incluye su path, sino lo indicas lo buscará en el directorio donde estas corriendo el programa. ] -- <br> .center[.content-box-green[**Vamos a vsCode**]] --- ## Leer un archivo - Podemos acceder un archivo usando `open()`. Necesita como argumento el archivo de texto que deseamos leer. -- - También necesitamos el método `read()` para **leer** el contenido. -- <img src="https://s.libertaddigital.com/2019/01/04/leersintiempo.jpg" width="700px" style="display: block; margin: auto;" /> --- ## Leer un archivo - Podemos acceder un archivo usando `open()`. Necesita como argumento el archivo de texto que deseamos leer. -- - También necesitamos el _método_ `read()` para **leer** TODO el contenido del archivo. -- ```python # Abriendo el archivo my_file = open("dna.txt") # Leyendo el archivo my_file_contents = my_file.read() ``` --- Se puede guardar el nombre del archivo en una variable. ```python # Agregando el nombre del archivo como variable my_file_name = "dna.txt" # Abriendo el archivo my_file = open(my_file_name) # Leyendo el archivo my_file_contents = my_file.read() # Mostrando el contenido print(my_file_contents) ``` -- .center[.content-box-green[**Vamos a vsCode**]] --- ## ¿Qué errores podemos tener? -- Error cuando no encuentra el archivo, el nombre se escribio mal, no se puso el path completo.., etc ```python my_file = open("rna.txt") ``` -- ¿Qué está mal? ```python my_file_name = "dna.txt" my_file = open(my_file_name) print(my_file) ``` --- ## ¿Qué pasa si imprimo la secuencia dentro de una oración de texto? ```python # Agregar el nombre del archivo como variable my_file_name = "dna.txt" # Leer el archivo my_file = open(my_file_name) my_dna = my_file.read() # Calular la longitud dna_length = len(my_dna) # Mostrar mensaje print("The sequence is " + my_dna + " and length is " + str(dna_length)) ``` -- <br> .center[.content-box-green[**Vamos a vsCode**]] --- ## Saltos de línea Python lee el archivo como: .content-box-red[`'ACTGTACGTGCACTGATC\n'`] -- `\n` es un caracter especial que agrega una nueva linea. -- Podemos quitarla usando el método `rstrip()`. El cual remueve cualquier caracter al final de la cadena, el default son espacios `" "`. --- ## Nuevas lineas ```python # Agregar el nombre del archivo como variable my_file_name = "dna.txt" # Leer el archivo my_file = open(my_file_name) my_file_contents = my_file.read() # Quitar el caracter de nueva linea \n my_dna = my_file_contents.rstrip("\n") # Calular la longitud dna_length = len(my_dna) # Mostrar mensaje print("The sequence is " + my_dna + " and length is " + str(dna_length)) ``` -- <br> .center[.content-box-green[**Vamos a vsCode**]] --- ## Usando varios métodos Es posible escribir varios métodos en la misma linea. Se aplican de izquierda a derecha. -- En vez de: ```python my_file_contents = my_file.read() my_dna = my_file_contents.rstrip("\n") ``` -- Se puede escribir: ```python my_dna = my_file.read().rstrip("\n") ``` --- ## Ejercicio para entregar .content-box-blue[ ¿Cuál es el porcetaje de `AT` y `GC` en la secuencia del archivo `dna.txt` `dna.txt = 'ACTGTACGTGCACTGATC'`? ] - Escribe un programa que te regrese el porcentaje de `AT` y `GC` pero que te pregunte la **ruta y el nombre** del archivo de DNA. - Output: un mensaje y el resultado Archivo de secuencia: `data/dna.txt` porcentaje de `AT` y `GC` `AT: # % ` `GC: # %` --- class: inverse, center, middle # `open()`: Escribiendo archivos --- # `open()`: Escribiendo archivos Así como abrimos un archivo y lo leímos en python, podemos escribir un archivo desde python. -- <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ9escDQSBplC0SZW-rLLH3JYXsA-87DdMVXrxST10ZKnP0YpnCKvfYv86Bqu0au2TYqjc&usqp=CAU" width="600px" style="display: block; margin: auto;" /> --- # `open()`: Escribiendo archivos Así como abrimos un archivo y lo leímos en python, podemos escribir un archivo desde python. --- # `open()`: Escribiendo archivos Necesitamos `open()` pero con otras especificaciones -- .content-box-green[ `r`- **Read ** - Valor *default*. Abre y lee un archivo. *Error si no existe* `a`- **Append ** - Abre un archivo por apendice (agregar al final) y crea un archive si no existe `w`- **Write ** - Abre un archivo para escribir y crea un archive si no exite `x`- **Create ** - Crea un archivo específico y regresa error si ya existe ] -- .content-box-red[**Importante**] - Si abrimos un archivo que ya existe usando `w`, se va a **reescribir**. - Si abrimos un archivo que ya existe usando `a`, se **añadirá** la información al final del contenido existente. --- # `open()`: Escribiendo archivos ```python my_file = open("out.txt", "w") my_file.write("Hello world") ``` -- <br> .center[.content-box-green[**Vamos a vsCode**]] --- class: inverse, center, middle # `.close()`: Cerrar --- # `.close()`: Cerrar Es importante cerrar cuando hayamos terminado de **leer** o **escribir**. -- Usamos el método `.close()` sin argumentos. ```python my_file = open("out.txt", "w") my_file.write("Hello world") # Cerrar el archivo my_file.close() ``` --- ## Ejercicio para entregar .content-box-blue[ Crea un archivo fasta a partir de la secuencia de DNA que está en `dna.txt` Ejemplo de un archivo fasta: ``` >sequence_name ATCGACTGATCGATCGTACGAT ``` ] - Lee el archivo `dna.txt` - Input: `dna.txt` Secuencia de DNA - Output: `dna.fasta` Archivo de texto con formato fasta