Universidad de Costa Rica | Escuela de Ingeniería Eléctrica IE-0117 Programación Bajo Plataformas Abiertas Entrada y Salida 1. Entrada estándar La forma más sencilla de leer datos desde la entrada estándar es usar la función raw_input(), que presenta al usuario un mensaje y retorna el texto que el usuario introduce: entrada = raw_input('Escriba su nombre:') En este caso, la cadena de caracteres ingresada por el usuario se guardará en la variable entrada. La función raw_input() siempre retorna una cadena de caracteres. Si es necesario leer números o algún otro tipo de datos, debe hacerse la conversión correspondiente. 2. Salida estándar Para imprimir datos en terminal se utiliza el enunciado print: print "Hola mundo" print automáticamente introduce un salto de línea al final. 3. Acceso a arivos Para acceder a archivos se utiliza la función open(): miarchivo = open('/home/usuario/datos.txt', 'r') La función open() recibe 2 argumentos. El primero es una cadena de caracteres que corresponde al nombre del archivo que se quiere acceder. El segundo es también una cadena que indica el modo que se utilizará para acceder el archivo. Los tres modos más comunes son 'r' para abrir el archivo para lectura, 'w' para abrir el archivo para escritura, eliminando cualquier contenido previo y 'a' para agregar nuevo contenido al final del archivo. open() retorna un objeto archivo. Este objeto tiene varios métodos que permiten llevar a cabo todas las operaciones necesarias sobre el archivo. 3.1. Lectura de arivos Para leer un archivo pueden usarse varios métodos: read(): Retorna una cadena de caracteres con el contenido completo del archivo. readlines(): Retorna una lista con todas las líneas (delimitadas por \n) del archivo. readline(): Retorna una cadena de caracteres con la línea actual y adelanta el puntero de archivo, de forma que la próxima vez que se llame a este método se obtenga la línea siguiente. Cuando se alcanza el fin de archivo, readline() retorna una cadena vacía. Puede usarse dentro de un lazo para recorrer la totalidad del archivo: 1 IE-0117 Programación Bajo Plataformas Abiertas Entrada y Salida # Lee la primera línea linea = miarchivo.readline() # Itera sobre las próximas líneas while linea: # Hace algo con la línea leída anteriormente ... linea = miarchivo.readline() Un objeto archivo es iterable, por lo que puede recorrerse usando un lazo for: for linea in miarchivo: # Hace algo con la línea leída ... En cada iteración una nueva línea del archivo será leída y almacenada en la variable linea. 3.2. Escritura en arivos Para escribir en un archivo puede utilizarse el método write(). Este método toma como argumento una cadena que será almacenada en el archivo: datos = open('datos.txt', 'w') datos.write("Esta cadena se guardará en el archivo\n") write() sólo puede escribir cadenas, por lo que cualquier otro dato que quiera guardarse debe ser convertido previamente. También puede usarse el enunciado print para escribir en archivos: a = 10 b = "hola" c = [1, 2, 3] print >>datos, a, b, c En este ejemplo, se agregará la siguiente línea al archivo: 10 hola [1, 2, 3] 3.3. El puntero de arivo Uno de los elementos principales de un objeto archivo es el puntero de archivo. El puntero de archivo indica la posición actual (en bytes) dentro del archivo. Cuando un objeto archivo es creado, el puntero de archivo se encuentra al inicio del archivo (posición 0) si el archivo se abrió en los modos 'r' o 'w', o al final si se abrió en modo 'a'. Las operaciones posteriores de lectura o escritura moverán el puntero de archivo automaticamente. Por ejemplo, readline() mueve el puntero al inicio de la próxima línea, read() mueve el puntero al final del archivo, etc. El método tell() retorna un entero con la posición actual del puntero de archivo. Si es necesario mover de forma explícita el puntero de archivo puede usarse el método seek(). Este método toma 2 argumentos. El primero es un entero con la cantidad de bytes que se quiere mover el puntero y el segundo una constante que indica el punto a partir del cual se hará el desplazamiento. Los valores posibles para esta constante son os.SEEK_SET o 0 para indicar un desplazamiento a partir del inicio del archivo, os.SEEK_CUR o 1 para indicar un desplazamiento a partir de la posición actual y os.SEEK_END o 2 para indicar un desplazamiento desde el final del archivo. Nótese que 2 IE-0117 Programación Bajo Plataformas Abiertas Entrada y Salida estas constantes están definidas en el módulo os, por lo que es necesario importar este módulo antes de usarlas. 4. sys.stdin, sys.stdout y sys.stderr El módulo sys define tres objetos archivo que siempre están abiertos y accesibles en todos los programas. Estos objetos archivo son sys.stdin que representa la entrada estándar, sys.stdout que representa la salida estándar y sys.stderr que representa el error estándar. Estos objetos implementan todos los métodos descritos en las secciones anteriores. Por ejemplo, si se quiere imprimir un mensaje en el error estándar puede usarse el siguiente código: print >> sys.stderr, "Ha ocurrido un error en el programa" 4.1. Redirección de entrada y salida estándar Usando los objetos archivo descritos en la sección anterior es posible redirigir la entrada o la salida de un programa a un archivo. # Todo lo que se escriba en la salida estándar se guardará en datos.txt, en vez de # desplegarse en la terminal datos = open('datos.txt', 'w') sys.stdout = datos print "Esto es una prueba" Si se ejecuta el código del ejemplo no aparecerá nada en la terminal, pero el archivo datos.txt contendrá la línea enviada a la salida estándar usando print. 3