Welcome to Scribd, the world's digital library. Read, publish, and share books and documents. See more
Download
Standard view
Full view
of .
Save to My Library
Look up keyword
Like this
2Activity
0 of .
Results for:
No results containing your search query
P. 1
Crea un Albun de Imagenes

Crea un Albun de Imagenes

Ratings: (0)|Views: 5 |Likes:
Published by Aprender Libre
Siguiendo con nuestro paseo por Python vamos a seguir
viendo características básicas, y concretamente en este
artículo, el tratamiento de ficheros.
Siguiendo con nuestro paseo por Python vamos a seguir
viendo características básicas, y concretamente en este
artículo, el tratamiento de ficheros.

More info:

Published by: Aprender Libre on Jun 30, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

02/01/2013

pdf

text

original

 
52
Número
02
www.linuxmagazine.com.es
Python
DESARROLLO
tiona una variable (vease Listado 1).Alguien puede crear un objeto de laclase
obj_variable
y llamar al método
set_variable(23)
, pero ¿cómo puedeestar seguro de que la variable
var 
tieneel valor 23 después de la llamada? Puedeque
var 
no fuese 0, porque otra llamadaanterior ya podría haberla asignado. Loúnico que podríamos hacer es llamar a
reset_variable()
y así asegurarnos deque nuestro valor sea asignado, peroentonces destruiríamos el valor anteriory no sabríamos qué podría pasar.Por lo tanto, necesitamos un mecanis-mo de comunicación para darle a cono-cer al usuario que esa variable ya estáasignada. Esto lo podemos hacer con lasexcepciones.En el Listado 2 aparece una clase quehereda de la clase
 Exception
(veremoslos mecanismos de herencia en otroartículo dedicado a los objetos) llamada
Var_Asignada
. Cuando en la clase
obj_variable
intentamos asignar unvalor a la variable
var 
y ésta no es 0,entonces se dispara, se eleva, la excep-ción
Var_Asignada
. Si no controlamos laporción de código en la que se encuen-tra
set_variable()
y aparece una excep-ción, el programa se detendrá y acabará.La idea detrás de las excepciones esque es posible tratarlas y evitar malesmayores, pudiendo en ocasiones inclusorecuperarnos de ellas. Para ello está laestructura
try-except 
. Rodeamos el códi-go que puede disparar excepciones conesta estructura (Vease Listado 3).A partir de ahora, y hasta que noexpliquemos con más profundidad eltema de las excepciones, cuando di-gamos que una función genera unaexcepción, significará que ese códigodeberá estar rodeado con una estructura
try-except 
.
Trabajo con Ficheros
Ya que hemos conseguido cierta solturacon los conceptos de objetos en Python,ahora vamos a ver como se manejan losaccesos a ficheros en él.Para acceder a un fichero primeronecesitamos crear un objeto
file
. El obje-to
file
es parte de la librería base dePython, así que no es necesario impor-tar ninguna librería externa.>>> archivo = file(‘texto.txt’)
file
abre los ficheros en modo de sólolectura por definición. Eso significa quesi el fichero no existe obtendremos unerror. Para verificar si el fichero existepodemos usar la función
exists()
de lalibrería
os.path
.LI:>>> import os.path >>>os.path.exists(‘texto.txt’) True >>>
E
n el último artículo vislumbramosalgo sobre cómo trabajar con obje-tos en Python. Fue algo muy sim-ple, pero que ya nos daba la posibilidadde organizar nuestro código en torno aello. Python hace un uso extensivo delos objetos en sus APIs, y especialmentedel control de errores mediante excep-ciones, lo que nos da la posibilidad delanzar excepciones cuando algo va mal.Una excepción es un mensaje quepodemos capturar cuando se ejecutacierta función o método y aparece unerror de algún tipo. Normalmente con-trolamos estos errores mediante el valordevuelto por la función (como por ejem-plo en C). Esta técnica es engorrosa,pero al igual que todo, tiene sus virtudesy sus desventajas. Sin embargo, Pythonhace uso de las excepciones en su lugar.Cuando una función genera unaexcepción decimos que
eleva unaexcepción
. Es muy normal tener quecontrolar las excepciones en las opera-ciones que realicemos con recursos quepueden no estar disponibles. Por eso lasvamos a ver, puesto que en este artículovamos a trabajar con archivos y conex-iones a Internet.Vamos a crear un objeto que gestioneun recurso que puede no estardisponible. En este caso el objeto ges-
Siguiendo con nuestro paseo por Python vamos a seguirviendo características básicas,y concretamente en esteartículo,el tratamiento de ficheros.
POR JOSÉ MARÍA RUÍZ Y JOSÉ PEDRO ORANTES
Manejo básico de ficheros
Crea unálbum deimágenes
 
53
www.linuxmagazine.com.es
Número
02
DESARROLLO
Python
os.path.exists(‘algo-peludo-y-feo.txt’)FalsePor lo tanto, si vamos a abrir unfichero, será importante asegurarse deque ya existe. Si en lugar de leer, lo quequeremos es crear el fichero, deberemosinvocar al constructor de
file
con losparámetros:
>>> archivo = file('texto.txt'
,'w')
Este segundo parámetro opcional nospermite definir el tipo de acceso quevamos a realizar al fichero. Tenemosvarias posibilidades: podemos leer (
),escribir (
w
), añadir al final del fichero(
a
) y también tener acceso de lectura/escritura (
r+w
). Disponemos tambiéndel modificador
b
para indicar accesobinario. Python considera a los ficheroscomo ficheros de texto por definición.Vamos a ver todas las combinaciones enel Listado 4.Con cualquiera de estas llamadas ten-dríamos en
archivo
, si todo ha ido bien,un objeto que gestiona el archivo indica-do. Es entonces cuando podemos operarsobre él. Las operaciones más típicas sonlas de leer desde el archivo y escribir enél. Para ello el objeto
file
dispone de losmétodos
read()
,
readline()
,
write()
y
writeline()
. Todos ellos operan con cade-nas de caracteres:
readline()
y
write-line()
trabajan con líneas de texto(acabadas en retorno de carro), mientrasque
read()
y
write()
lo hacen con cade-nas sin restricciones.Lo que vemos en el Listado 5 son algu-nas manipulaciones sobre un fichero. Loprimero que tenemos que hacer es crearel fichero, para lo cual lo abrimos enmodo de escritura, ‘w’, que creará elfichero o truncará el existente (lo borrarápara crearlo de nuevo, aunque si lo quequeremos es añadir al final, usaremos‘a’). Posteriormente escribimos en él unacadena con un retorno de carro en mitad(para hacer nuestras pruebas) y cer-ramos el fichero. Es importante cerrar losficheros cuando dejemos de usarlos,pero en este caso la razón para cerrarloes que vamos a volver a abrirlo en modode lectura.Ahora volvemos a abrir el fichero enmodo de lectura y leemos 4 bytes quealmacenamos en la variable
cadena
.Cuando leemos con
read()
avanzamosen el fichero, esa es la razón de que elposterior
readline()
lea la cadena “mundo\n” en lugar de “Hola mundo”.También vemos que se para en el retornode carro en lugar de continuar. El segun-do
readline()
ya nos permite leer la cade-na Adios mundo”.Pero… ¿qué ocurriría si en una de laslecturas nos encontrásemos con el fin defichero? En el caso de que leyésemos unacadena con el fin de fichero (EOF), alfinal simplemente nos quedaríamos conla cadena hasta el EOF. En cambio, sisólo leemos el EOF, entonces obtenemosuna
null
. Esto es importante para com-probar que hemos acabado con elfichero. Así, un bucle que escriba porpantalla el contenido del fichero, com-probaría en cada vuelta si la cadena quedevuelve
readline()
es
null
.Ahora que ya sabemos crear archivos,tenemos que aprender a borrarlos. Estose realiza mediante la función
remove()
de la librería
os
. Esta función acepta laruta de un fichero y lo borra. Si en lugarde un fichero le pasamos un directorioelevará una excepción “OSError”.
>>> import os>>> os.remove(texto.txt)>>>
Directorios y Sistema deFicheros
Con estos pocos métodos tenemos ya anuestro alcance la manipulación básicade ficheros. Pero vamos a necesitar paranuestro programa la posibilidad de creardirectorios. ¿Cómo lo haremos? Puesmediante la función
mkdir()
, que aceptauna cadena y crea un directorio con esenombre. Si queremos crear un directorioque esté dentro de otros directorios tam-bién nuevos, tenemos que usar
makedirs()
. Ambas funcionespertenecen al módulo
os
por lo que parausarlas tendremos que hacer:
>>> import os>>> os.mkdir('uno')>>> os.makedirs('dos/tres')
Para borrar esos directorios usaremos lafunción
rmdir()
y
removedirs()
. Laprimera borra un directorio, mientras quela segunda borra una ruta de directorios.Vamos a ver esto con más detenimiento.
>>> os.rmdir('uno')>>> os.removedirs('dos/tres')
01 >>> class obj_variable:02 ... __init__(this):03 ... var = 004 ...05 ... set_variable(this,valor):06 ... if (var == 0):07 ... var = valor08 ...09 ...reset_variable(this):10 ... var = 011 ...12 >>>
Listado 1
01 >>> classVar_Asignada(Exception):02 ... """ Excepción que sedispara al intentar asignar03 ... una variable yaasignada en obj_variable"""04 ... pass05 ...06 >>>07 >>> class obj_variable:08 ... """ Administra unavariable """09 ... def __init__(self):10 ... self.var = 011 ...12 ... def set_variable(self,valor):13 ... if (self.var ==0):14 ... self.var =valor15 ... else:16 ... raiseVar_Asignada17 ...18 ... defreset_variable(self):19 ... self.var = 020 ...21 >>>22 >>> a = obj_variable()23 >>> a.set_variable(12)24 >>> a.set_variable(34)
Listado 2
 
54
Número
02
www.linuxmagazine.com.es
Python
DESARROLLO
Crear, eliminar un directorio.Cambiar el directorio de traba-jo.
Python y la web
Python posee gran cantidad de libreríaspara trabajar con recursos de Internet.De hecho Zope [1], un servidor de apli-caciones con gran éxito, está creado enPython y hace uso de todas sus carac-terísticas. Mailman [2] o Bittorrent [3]son también buenos ejemplos.Debido a su flexibilidad, Python esusado como lenguaje de implementaciónpara multitud de aplicaciones de red asícomo aplicaciones distribuidas. Por eso,no es de extrañar que Python suela ser ellenguaje en el que se implementanmuchas de las más novedosas tec-nologías de red.En este apartado vamos a comenzarcon lo básico. Queremos traer un recursode la red a nuestra máquina, y para elloemplearemos una URL[4] del estilo
http://www.algunaweb.algo/imagen.jpg 
.Pero primero necesitamos crear unaconexión con el servidor.Vamos a emplear para ello la librería
httplib
que viene con Python. Esta libr-ería nos permite establecer una conexióncon un servidor http y mandarle coman-dos http. Los comandos http son sim-ples, y de todos ellos, de momento sólonos interesa uno, el comando
GET 
.Cuando accedemos a un servidor http,por ejemplo para ver una página web, loque hacemos es pedirle objetos. Esto sehace mediante el comando
GET <obje-to>
. Por ejemplo, si queremos la página
index.html
de la web
http://www.python.org 
, primero conecta-mos con el servidor http de
http://www.python.org 
y después, unavez conectados, le enviamos al servidorhttp el comando
GET index.html
. En esemomento el servidor nos devuelve por elmismo canal el contenido del archivoindex.html.Dicho así parece muy fácil, pero esuna tarea que en un lenguaje de másbajo nivel requeriría gran cantidad delibrerías y control de errores. En Pythonvamos a tener muchas menos dificul-tades. Siguiendo con la explicaciónvamos a ver en el Listado 6 comoharíamos precisamente lo que hemosdichoLo primero es importar la librería
httplib
, creamos entonces una conexióncon el host en cuestión y pedimos elarchivo
index.html
. Esa conexión generauna respuesta. La respuesta está forma-da por varias partes, entre ellas un códi-go numérico (como el famoso 404), untexto que describe el error y una cone-xión al archivo que pedimos. En el casode una conexión correcta recibiremos un
200
, un
OK 
y una conexión con elfichero. De esa conexión leemos con
read()
el contenido y lo almacenamos enuna variable que llamamos
dato
.Entonces podremos cerrar la conexióncomo si de un fichero se tratara.En ese momento ya tenemos la infor-mación que queríamos en
dato
y el canalcerrado. ¿No es muy difícil, no?
rmdir()
borrará el directorio “uno”, queno contiene ningún otro objeto en suinterior (ni directorios, ni ficheros). Encaso de tenerlo, la llamada devolvería unerror. La función
removedirs()
comen-zaría a borrar desde el directorio queestá más a la derecha de la ruta (“tres”)hacia el que está más a la izquierda(“dos”). Pero imaginemos que dentro de“dos” también hay un directorio “cua-tro”. Entonces se borraría el directorio“tres”, y cuando la función fuese a bor-rar el directorio “dos” se encontraría conque no puede porque existe dentro de élun directorio llamado “cuatro” y pararía.En cuanto a
removedirs()
, este comandoaplica
rmdir()
de derecha a izquierda enla ruta.Imaginemos ahora que necesitamoscambiar el directorio en el que estamostrabajando. En el momento de arrancarel programa ese directorio es el quealberga el programa o bien es el directo-rio desde el que se ejecutó, pero no siem-pre es en el que queremos que el progra-ma trabaje. Cualquier referencia a unfichero será tomando como base el direc-torio de trabajo, en caso contrario ten-dríamos que especificar la ruta de traba-jo. Para poder cambiar el directorio detrabajo, el módulo
os
tiene la función
chdir()
. Si invocamos dentro de nuestroprograma:
>>> os.chdir('/tmp')
Desde ese momento cualquier referenciaa un fichero será direccionada a “/tmp”.Ahora podemos:Abrir, cerrar, modificar unfichero.
01 >>> try:02 ... set_variable(12)03 ... set_variable(34)04 ... except:05 ... print "ERROR: Se haintentado asignar"06 ... print "un valor a unavariable ya asignada"07 ...08 ERROR: Se ha intentado asignar09 un valor a una variable yaasignada10 >>>
Listado 3
01 >>> archivo =file('texto.txt','r')02 >>> archivo =file('texto.txt','w')03 >>> archivo =file('texto.txt','a')04 >>> archivo =file('texto.txt','r+w')05 >>> archivo =file('texto.txt','r+b')06 >>> archivo =file('texto.txt','rb')
Listado 4
01 >>> archivo =file('/tmp/texto.txt','w')02 >>> archivo.write("Holamundo\nAdios mundo")03 >>> archivo.close()04 >>>05 >>> archivo =file('/tmp/texto.txt','r')06 >>> cadena = archivo.read(4)07 >>> cadena08 'Hola'09 >>> cadena =archivo.readline()10 >>> cadena11 ' mundo\n'12 >>> cadena =archivo.readline()13 >>> print cadena14 'Adios mundo'15 >>> archivo.close()
Listado 5

You're Reading a Free Preview

Download
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->