jueves, 6 de febrero de 2014

Archivos con Python

Introducción

por: The Inspector

Python es un lenguaje de scripts muy popular en la actualidad, así que decidí crear mi propia entrada sobre este tema en particular, ya que en varias entradas que he leído, siempre me ha parecido que les queda faltando algo, yo intentaré cubrir un poco mas el tema y espero que cuando termine, me quede faltando menos de lo que les falto a las entradas que leí.

El tema de los archivos se hace importante cuando comienzas a escribir scripts funcionales mas allá de pruebas básicas de uno u otro algoritmo, justo en el momento en que dices “¿Cómo hiciera para conservar esta información?”.


Python cuenta con varias formas de manejar archivos, yo me centraré en el módulo io, este módulo en cuestión, posee un grupo de funciones para manejar archivos, y me he centrado en este modulo porque las funciones que contiene, devuelven valores que para comenzar es importante siempre tener en cuenta.

En primer lugar la función io.open(nombre_de_archivo, modo) permite hacer la apertura de un archivo cuya ruta puede ser relativa al directorio actual o absoluta; en uno de varios modos que pueden ser para lectura, escritura, agregado o combinaciones de estos.

Nota: El módulo os permite conocer el directorio de trabajo actual por medio de la función os.getcwd() y establecer el directorio actual por medio de la función os.chcwd(ruta); se debe tener en cuenta que la barra invertida ( \ ) en Windows es un caracter de escape, así que para que la ruta sea valida se deben utilizar dos barras invertidas y que la ruta debe ser una cadena entre comillas, ejemplo ('d:\\Escritorio').

Respecto a los modos de apertura pueden ser:

Modo
Descripción
r
apertura para solo lectura (modo por defecto)
a
apertura para agregar al final de archivo
w
apertura para solo escritura

Es posible combinar los modos de apertura anteriores con los detallados a continuación para extender su funcionalidad:

Modo
Descripción
t
indica que la información será tratada como datos texto (modo por defecto)
b
Indica que los datos del archivo serán tratados como binarios.
+
indica que el archivo se abre para lecto/escritura

Es importante el buen manejo de estos modos de apertura, para no estar dando vueltas abriendo y cerrando el archivo cuando no es necesario.

Una vez se tiene abierto el archivo podemos proceder a su manejo para ello, podemos utilizar diferentes funciones dependiendo del tipo de trabajo que vayamos a realizar con el.

Función
Descripción
read([n])
Esta función permite leer del contenido del archivo, el parámetro entre corchetes es opcional y permite especificar la cantidad de bytes que queremos leer del archivo desde la ubicación actual del puntero; en caso de no suministrar el parámetro la función leerá desde la ubicación actual del puntero hasta el final del archivo.
write(b)
Esta función permite escribir en el archivo en la ubicación actual del puntero el valor que se le pase como parámetro.
tell()
Esta función permite conocer la ubicación actual del puntero dentro del archivo.
seek(p,[d])
Esta función permite ubicar el puntero en el archivo, el parámetro p un entero positivo o negativo que indica la posición que queremos darle al puntero, el parámetro d puede ser 0, 1 o 2 es opcional y permite especificar desde donde nos desplazaremos
0 → indica que el desplazamiento es relativo al inicio del archivo(valor por defecto)
1 → indica que el desplazamiento es relativo a la ubicación actual del puntero
2 → indica que el desplazamiento es relativo al final del archivo.
readable()
Devuelve true si el archivo permite su lectura con el método read()
seekable()
Devuelve true si el archivo permite movilizar el puntero con el metodo seek()
writable()
Devuelve true si el archivo permite escritura en el.

Es necesario tener en cuenta que las operaciones de lectura o escritura modifican la ubicación actual del puntero.

Una diferencia notable entre importar o no el módulo io, radica en que las funciones seek(), write() devuelven, la primera un valor que indica la ubicación actual del puntero después de utilizarla y la segunda un valor que indica cuantos bytes fueron escritos en el archivo. Así como también el módulo io cuenta con las funciones readable(), seekable(), writable().

Ejemplos

Como primera medida se importa el módulo io

import io

Para abrir un archivo donde solo queremos leer el contenido, asignar el contenido a una variable llamada datos para procesar la información y cerrar el archivo sería:

archivo = io.open('ruta_del_archivo', 'r')
datos = archivo.read()
archivo.close()

Para abrir un archivo donde solo queremos leer parte del contenido, asignar el contenido a una variable para procesar la información y cerrar el archivo sería:

leer = 5 //cantidad de bytes que queremos leer
archivo = io.open('ruta_del_archivo', 'r')
datos = archivo.read(leer)
archivo.close()

Lo anterior leería los primeros 5 bytes y dejaría el puntero a 5 bytes del inicio del archivo.
Si lo que queremos es leer parte del archivo que no se encuentra en el inicio debemos primero ubicarnos en el byte donde queremos empezar a leer.

leer = 2 //cantidad de bytes que queremos leer
ubic = 20 //ubicación donde queremos leer los 2 bytes
archivo = io.open('ruta_del_archivo', 'r')
archivo.seek(20)
datos = archivo.read(leer)
archivo.close()

Para escribir en un archivo modificamos el modo de apertura por 'w' teniendo en cuenta que este modo creará un archivo si no existe o sobrescribirá el archivo si ya existe.

escribir = 'texto a escribir' //cantidad de bytes que queremos leer
archivo = io.open('ruta_del_archivo', 'w')
archivo.write(escribir)
archivo.close()

Para tanto escribir como para leer un archivo sin necesidad de estar abriendo y cerrando para cambiar de modos se puede usar combinaciones de modos como la siguiente donde se leen los primeros 5 bytes del archivo, luego se retorna al inicio del archivo para escribir algo de contenido.

leer = 5 //cantidad de bytes que queremos leer
escribir = 'texto para escribir '
archivo = io.open('ruta_del_archivo', 'rw')
datos = archivo.read(leer)
archivo.seek(0)
archivo.write(escribir)
archivo.close()

En los ejemplos anteriores se han utilizado archivos de texto, sin embargo, funciona exactamente igual para los archivos binarios donde la única diferencia consiste en el modo de apertura:

leer = 5 //cantidad de bytes que queremos leer
escribir = '\x68\x6F\x6C\x61'
archivo = io.open('ruta_del_archivo', 'r+b')
datos = archivo.read(leer)
archivo.seek(0)
archivo.write(escribir)
archivo.close()


No hay comentarios.:

Publicar un comentario