Entrada/Salida Introducción a la computación Juan Manuel Pérez (en base a slides de Maximiliano Geier) 04/05/2016 Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 1 / 21 Introducción ¿Qué vamos a ver hoy? Vamos a ver distintas formas de ingresarle datos a un programa y obtener una respuesta. Teclado/Pantalla Lı́nea de comandos Archivos de texto binarios Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 2 / 21 Teclado/Pantalla El programa más fácil >>> print(’Hola mundo’) Hola mundo print imprime sus argumentos en pantalla ¿Qué devuelve? Nada (o sea None) Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 3 / 21 Teclado/Pantalla Format Strings >>> str = "mundo" >>> print("Hola {}".format(str) ) Hola mundo .format es un método de un string que, dado un “formato” y sus argumentos, nos devuelve otro string reemplazando . Nos permite combinar variables para formar otro string El formato en este caso es "Hello {}", y el argumento es str Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 4 / 21 Teclado/Pantalla Format Strings: estilo viejo >>> str = "mundo" >>> print("Hola %s" % (str)) Hello world % es un operador entre un string de formato y una tupla que contiene sus argumentos En Python 3 se aconseja utilizar format Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 5 / 21 Teclado/Pantalla Entrada por teclado >>> nombre = input("Ingresa tu nombre: ") Ingresa tu nombre: Guido van Rossum >>> print("Hola {}".format(nombre)) Hola Guido van Rossum 1 input se queda esperando que el usuario ingrese caracteres por medio del teclado, termina cuando se ingresa un \n (newline) ¿Qué devuelve input? Una cadena de caracteres. 1 Guido van Rossum es el creador de Python. Actualmente trabaja en Dropbox Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 6 / 21 Lı́nea de comandos Lı́nea de comandos y argumentos Otra forma de interacción para introducir datos en un programa python3 suma.py 1 2 3 4 python3: el nombre del programa que se estamos ejecutando. suma.py 1 2 3 4: los argumentos que le pasamos a python3. Sı́, ojo: suma.py es un argumento también ¿Cómo accedemos a los argumentos? Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 7 / 21 Lı́nea de comandos sys.argv: Argumentos al programa #imprimir.py import sys print(sys.argv) Los argumentos son accesibles desde sys.argv, que es una lista de cadenas de caracteres. Primero, hay que importar el módulo sys. - python3 imprimir.py 1 2 3 [’imprimir.py’, ’1’, ’2’, ’3’] Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 8 / 21 Archivos Archivos Un archivo es un recurso disponible a los programas, utilizado para almacenar información en un medio durable. Los archivos se localizan en una estructura jerárquica que se denomina árbol de directorios. Una ruta o path es el camino del árbol (relativo a cierto punto o absoluto) que hay que recorrer para llegar a un archivo. / |__ |__ | |__ | | |__ bin/ etc/ |__ passwd home/ |__ jmperez/ |__ datos.csv tmp/ |__ fruta.txt Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 9 / 21 Archivos Archivos de texto y binarios Python (y la mayorı́a de los lenguajes de programación) distingue entre archivos de texto y archivos binarios. Un archivo de texto se interpreta como texto en alguna codificación (ASCII, Latin-1, UTF-8, etc). Su procesamiento se lo suele realizar de a lı́neas que están separadas por los caracteres \n (Linux, Mac) o \r\n (Windows). Un archivo binario tiene datos guardados en algún formato arbitrario. Es responsabilidad del programador interpretarlos de manera adecuada. Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 10 / 21 Archivos Archivos de texto vs. Archivos binarios En la materia vamos a trabajar con archivos de texto. Algunas ventajas: Podemos ver en cualquier editor de texto si la entrada que queremos interpretar es correcta (o si la salida lo es). Su interpretación es independiente de la plataforma (con la excepción de los finales de lı́nea en Windows). Python tiene muchas herramientas que nos ayudan al procesamiento. Desventajas: Los datos numéricos tienen que ser convertidos para poder operar con ellos (esto requiere tiempo). Requieren cierto procesamiento por parte del programador para interpretar la estructura de los datos. Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 11 / 21 Archivos Archivos en Python f = open(’/tmp/fruta.txt’, ’r’) Los archivos son recursos que tenemos que pedir al sistema operativo para poder utilizar. En Python, esto se hace por medio de la función open El primer argumento que recibe open es el path (relativo o absoluto) del archivo que queremos abrir. El segundo argumento indica en qué modo2 queremos abrir el archivo (solo lectura, lectoescritura, solo escritura, de texto o binario). open devuelve un file object, que guarda información de estado acerca del archivo abierto. 2 http://docs.python.org/3/library/functions.html#open Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 12 / 21 Archivos Cerrar archivos f = open(’/tmp/fruta.txt’, ’r’) # leemos y escribimos información acá f.close() Una vez que terminamos de trabajar con el archivo, no olvidarse de cerrarlo con f.close(). Otra forma de hacerlo: with open(’/tmp/fruta.txt’, ’r’) as f: # usamos f acá str = f.read() print("Acá ya no existe f") Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 13 / 21 Archivos Leyendo archivos Supongamos que ya abrimos el archivo /tmp/fruta.txt y el resultado de la llamada a open lo guardamos en la variable f. Si queremos leer su contenido tenemos varias opciones La primera: leer todo el archivo de una >>> print(f.read()) una linea otra linea f.read() nos devuelve un string con todos los contenidos del archivo Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 14 / 21 Archivos Leyendo archivos: lı́nea por lı́nea >>> print(f.readline()) una linea >>> print(f.readline()) otra linea f.readline() nos devuelve un string con la próxima lı́nea del archivo ¿Y si no hay otra lı́nea? No devuelve nada (o sea None) Es medio molesto para recorrer todo el archivo. Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 15 / 21 Archivos Leyendo archivos: recorriendo lı́nea por lı́nea >>> for line in f.readlines(): ... print(line) ... una linea otra linea f.readlines() nos devuelve una lista de todas las lı́neas del archivo Otra forma: for line in f: Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 16 / 21 Archivos Escribiendo archivos Para escribir, utilizamos el método write: with open("fruta2.txt", ’w’) as f: f.write(’una nueva linea\n’) f.write(’otra nueva linea\n’) También podemos utilizar print: with open("fruta2.txt", ’w’) as f: print(’una nueva linea\n’, file=f) print(’otra nueva linea\n’, file=f) La posición en la que vamos a leer o escribir está “almacenada” en el file object. Cualquier llamada a read, write o print actualiza esa posición adecuadamente. Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 17 / 21 Archivos Comma-separated Values (CSV) CSV es un formato de archivos de texto muy utilizado para almacenar tablas de valores numéricos. Consta de una serie de registros, uno por lı́nea. Cada registro tiene varios campos, separados por coma (u otro separador, como ;) Opcionalmente, tenemos un encabezado con los nombres de cada campo En lenguaje coloquial, se puede pensar como una tabla o una planilla de cálculo Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 18 / 21 Archivos Ejemplo CSV titulo,autor,a~ no,precio Rebelión en la Granja,George Orwell,1945,54.00 La Insoportable Levedad del Ser,Milan Kundera,1984,120.50 2001:Odisea en el Espacio,Arthur C. Clarke,1984,120.50 La Gran Revolución Francesa,Piotr Kropotkin,1909, 234.75 Humano demasiado humano,Friedrich Nietzsche,1878,75.00 Fedra,Jean Racine,1659,45.00 El Principito by Gaturro,Nik,2015,0 Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 19 / 21 Archivos Procesando CSV: rstrip ¿Cómo eliminar el ’\n’ final de una lı́nea? >>> l = ’3.5,6.5,-4.3,0\n’ >>> print(l) 3.5,6.5,-4.3,0 >>> l = l.rstrip(’\n’) >>> print(l) 3.5,6.5,-4.3,0 Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 20 / 21 Archivos Procesando CSV: rstrip ¿Cómo separar los campos de una lı́nea de CSV? >>> l = ’3.5,6.5,-4.3,0’ >>> print(l.split(’,’)) [’3.5’, ’6.5’, ’-4.3’, ’0’] Juan Manuel Pérez (en base a slides de Maximiliano Geier) Entrada/Salida 04/05/2016 21 / 21