Archivos
Transcripción
Archivos
01/11/2016 Capitulo 3. manejo de archivos ¿Qué un archivo? Un archivo es una colección de datos que se almacenan en memoria secundaria (disco duro o una USB por ejemplo), lo que implica que el acceso es muy lento, por ello se establece una conexión entre el archivo y el programa para mover datos entre los dos, esta conexión se realiza en Python con open(). Es decir se crea como un puntero (índice al archivo/objeto a archivo/flujo). Cada vez que se requiera leer/escribir archivos se debe conocer el formato (como se guarda) la información del archivo. Por ejemplo un número por línea, el archivo sigue el formato de word, etc 1 01/11/2016 Tipos de archivos En general existen 2 tipos de archivos: • Archivos de texto: archivos donde normalmente el espacio y nueva línea(“\n") son caracteres de control, generalmente legibles para humanos • Archivos de binarios: archivos donde toda la información esta en lenguaje máquina (0’s y 1’s) para ser entendida directamente por la máquina, por lo cual no son legibles por humanos. • ¿Cuantos bytes tiene el siguiente archivo? Que necesitamos para trabajarlos Para trabajar archivo con Python se necesita conocer: • Ruta (camino) – PATH – ubicación en sistema de archivos. (carpeta donde está el archivo ubicado) • Nombre (que lo diferencia de los demás archivos) • Extensión - Según la extensión el SO asocia una aplicación p.eg .doc se asocia word, .xls se asocia excel. • Según la extensión y/o la información del creador del archivo debemos conocer la forma de guardar la información (formato) tanto si el archivo es binario como modo texto • Modos de acceso para abrir el archivo: “r” (lectura), “w” (escritura), “a” (Adición al final del archivo) 2 01/11/2016 Modos y carácter de nueva de línea Cuidado con los modos de escritura • Tenga cuidado si se abre un archivo con el modo 'w' , porque ocasiona la destrucción de los datos existentes. • El modo "a" es más bonito, que le permite escribir en el final de un archivo existente sin cambiar el contenido existente!! 3 01/11/2016 Que debemos saber • Todo acceso de lectura(r) o escritura(w) en un archivo de texto se realiza mediante cadenas(string) – todo lo que lee es una cadena – si se escribe en un archivo, sólo se puede escribir una cadena • Todo acceso de lectura/escritura (R/W) desplaza el flujo o puntero a archivo. • A través de un ciclo for se puede recolectar información del archivo previamente abierto en modo lectura una línea a la vez. Pasos para trabajar con archivos 1. Conocer la ruta, nombre, extensión del archivo y modo. 2. Abrir el archivo con open() (Aquí se crea el flujo/objeto a un archivo) 3. Leer/escribir (R/W) el archivo mediante el flujo creado en el paso 2. Recuerde que aquí el flujo se desplaza. 4. Cerrar el archivo con el método .close() 4 01/11/2016 Creando el flujo my_file = open("archivo.txt", "r") my_file es el flujo/objeto a archivo. La función open() establece una conexión entre el archivo en disco y nuestro programa para mover datos entre los dos. Como se ve tiene dos argumentos que este caso ambos son cadenas. El primer argumento es el nombre del archivo en disco, el segundo es el modo en que se trabajará el archivo (recuerde aquí,"r" significa modo lectura) ¿Donde esta el archivo en disco? • Cuando se crea el flujo/objeto a archivo, el nombre del archivo puede venir en una de dos formas: • "archivo.txt" asume que el nombre del archivo es archivo.txt y se encuentra en el mismo directorio donde se encuentra nuestro programa (módulo de python) • "C:\proyecto\archivo.txt" es el nombre de archivo completo e incluye la información de la ruta del archivo(PATH). 5 01/11/2016 close Cuando el programa ha terminado con un archivo, cerramos el archivo con close • close elimina la conexión con el archivo • close es un método de un objeto a archivo/flujo: file_obj.close () • Todos los archivos deben ser cerrados!!! leer (R) • my_file.read() Lee todo el contenido del archivo como una cadena y lo devuelve. Se puede tomar un número entero N como argumento opcional para limitar la lectura de N bytes • my_file.readline() Retorna/Entrega la siguiente línea como un string • my_file.readlines() # note plural Retorna una lista de todas las líneas del archivo 6 01/11/2016 Ejemplo de archivos Suponga que tenemos un archivo llamado temp.txt el cual tiene el siguiente contenido Primera Linea Segunda Linea Tercera Linea Cuarta Linea 7 01/11/2016 8 01/11/2016 Escribir (w) • Una vez el archivo es abierto en el modo apropiado, podemos escribir en el archivo: • my_file.write(s)Escribe la cadena s en el archivo • my_file.writelines(lst) # note plural Escribe una lista de string (una al tiempo) en el archivo. En este caso la lista se llama lst • Usando print: se adiciona file=flujo como argumento al print. En este caso sería agregar al print file=my_file Escribir (forma 1) 9 01/11/2016 Escribir (forma 2) Interrogantes • ¿Cómo podemos identificar la ruta (PATH) o directorio actual de trabajo en namespace? • ¿Cómo podemos identificar en que posición de archivo se encuentra el flujo/objeto a archivo? • ¿Cómo podemos identificar una situación excepcional, como los errores que se producen al leer un archivo que no existe? Existe algún método para ello? 10 01/11/2016 Recordemos • Cada read / readline / readlines / write / writelines / print(..,file=my_file) mueve la posición actual hacia delante • Cuando llegue al final, cada lectura sólo se producirá '' (cadena vacía), ya que está al final • No hay indicación de final de archivo de esta manera! • Es obvio que para leer/escribir en el archivo, primero se debe ubicar el flujo/objeto a archivo en el lugar adecuado. Por ejemplo si se requiere leer nuevamente el archivo se debe volver al principio del archivo. Módulo OS • El módulo os en Python es una interfaz entre el sistema operativo y el lenguaje Python. • Como tal, tiene muchos sub-funcionalidades relacionadas con diversos aspectos. • Vamos a ver solo la parte relacionada con un archivo 11 01/11/2016 Algunos comandos del OS • os.getcwd() Retorna el PATH completo del directorio actual de trabajo (current working directory) • os.chdir(path_str) Cambia el directorio actual de trabajo al PATH dado en la cadena path_str • os.listdir(path_str) Retorna la lista de archivos y directories del PATH actual (incluye '.') • os.path.isfile(path_str) retorna True o False si el achivo en path_str existe La posición actual en el archivo • Cada archivo mantiene una posición actual en el archivo. • Indica lo que se leerá en el archivo a continuación. • Cuando se abre el archivo en el disco, el contenido del archivo se copia en el búfer del objeto de archivo • Piense en el objeto de archivo como una lista muy grande, donde cada índice es uno de los bytes que compone el archivo • La posición actual es el índice actual en esa lista 12 01/11/2016 Otros métodos para trabajar archivos • tell() Retorna la posición actual en el archivo contado desde el inicio del archivo (Primer byte del archivo) my_file.tell() => 42L • seek() Actualiza/cambia la posición actual del archivo a un nuevo índice del archivo (en bytes de desplazamiento desde el principio del archivo) fd.seek(0) # mueve el flujo al principio del archivo fd.seek(100) # 100 bytes desde el principio 13 01/11/2016 Argumentos opcionales de seek • seek() tiene un conjunto de argumentos opcionales: 0: cuenta desde el principio 1: cuenta desde la posición actual del archivo 2: cuenta desde el final (hacia atrás) Ejemplo de los métodos tell() y seek() 14 01/11/2016 Manejo de excepciones en Python try-except suite para detectar errores: try: suite a observar except ErrorParticular error suite Tipos de excepciones/errores a identificar Nombres de error >>> 100/0 Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> 100/0 ZeroDivisionError: integer division or modulo by zero >>> open('temp.txt') Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> open('badFileName') FileNotFoundError: [Errno 2] No such file or directory: 'temp.txt' 15 01/11/2016 Ejemplo de Manejo de excepciones try: in_file=open(“temp.txt”,”r”) except FileNotFoundError: print(“error con Archivo”) sys.exit() Manejo de archivo csv 16 01/11/2016 Manejo de csv import csv workbook_file=open("datos.csv","r") workbook_reader=csv.reader(workbook_file) for fila in workbook_reader: print(fila) workbook_file.close() 17