martes, 11 de septiembre de 2012

Halzo tu mism@ en Python


La ubicuidad de la tecnología de la información y los niveles en los que su uso ha permeado nuestra cotidianidad - telefonos celulares, correo electrónico, realización de tramites por Internet, blogs, Facebook, Twitter, etc. - hacen necesario que el ciudadano común aprenda ciertos conocimientos básicos sobre su utilización.  De hecho, estos conocimientos son tan importantes como la lectura, la escritura y la aritmética para poder desenvolverse en una sociedad moderna; quien carece de ellos es en cierta forma un analfabeta.  ¿Es adecuada la educación en tecnologías de información que se imparte en las escuelas e inclusive en la universidad? ¿Es necesario "profundizar" sobre estos conocimientos y aprender a programar, por ejemplo? En tal caso, ¿porqué debería enseñarse un lenguaje de programación como Python? ¿Es la programación una actividad solo para especialistas y profesionales en el área informática? ¿Qué ganaría una persona común con aprender a programar (en Python)? Estas son las interrogantes que abordaré en este ensayo, pero vamos a empezar por enmarcar este tema desde una perspectiva histórica y algo nostálgica.


Hace poco menos de 40 años, en 1975, salió al mercado la primera computadora personal, la Altair (Fig. 1.a.), con 1024 bytes de memoria y un procesador Intel 8008.  Hasta ese entonces, las computadoras eran unas máquinas misteriosas solamente asequibles para las grandes corporaciones o instituciones del gobierno.  Hasta ese entonces, nadie pensaba que un ciudadano común pudiese tener algo así como una computadora personal.  A decir verdad, la Altair todavía distaba mucho de ser una computadora "amigable" que podía ser manejada por una ama de casa o uin niño.  Los primeros usuarios eran entusiastas de la electrónica que habían tenido cierta exposición a las computadoras grandes (los mainframes) y que deseaban experimentar con una computadora en casa.  Programar la Altair era un proceso complicado: a través del panel frontal, el usuario cargaba código máquina directamente en determinadas posiciones de la memoria mediante suiches.  Por toda salida de estos programas, la computadora prendia ciertos LEDs en el panel frontal (Fig. 1.b).  Muy pronto se desarrollarían interfaces para conectar la máquina a un terminal de teletipo, con teclado y pantalla, así como también dispositivos de almacenamiento secundario.  Los fabricantes de la Altair recibieron ese mismo año una propuesta para crear un interprete de lenguaje BASIC para la máquina.  La propuesta venía de Paul Allen y Bill Gates, quienes eventualmente fundarían una compañía llamada Microsoft (entonces era Micro-soft).


Fig 1.a. La Altair












Fig 1.b. Panel frontal de la Altair

Con la Altair llegó la Era de la Computadora Personal.  Seguidamente, en 1977 Steve Wozniack y el recien fallecido Steve Jobs crearon una computadora, la Apple II (Fig. 2.a), cuyo debut en el mercado fue muy exitoso.  La Apple II, con un microprocesador MOS 6052, tenía un interprete BASIC incorporado en la memoria ROM, un teclado, 4096 bytes de memoria RAM y se podia acoplar a un televisor normal. Después de la Apple II surgieron muchos otros modelos de distintos fabricantes, todas eran computadoras orientadas al uso personal o del hogar, pero tenian algo en común- un interprete BASIC.


Fig 2.a. La Apple II

Fig 2.b. Atari 800 XL con casetera. La casetera era el dispositivo de almacenamiento secundario más común.

Cada una de estas máquinas tenía una ámplia selección de software disponible: videjuegos, programas educativos, procesadores de palabra, aplicaciones para ayudar con el control de las finanzas del hogar, etc.  Sin embargo, a differencia de los dispositivos de hoy en día - los dispositivos móviles y sus Apps, las cónsolas de videojuegos, minis, eReaders - aquellas computadoras estaban especificamente diseñadas para que los usuarios creasen sus propias aplicaciones en BASIC.  En la década de los 80's, la instrucción en computación que se impartía en las escuelas norteamericanas y europeas estaba orientada a enseñar programación (en lenguaje BASIC).  Es este sentido, es notable el proyecto de alfabetización computacional del gobierno británico, el cual era operado por la BBC y era basado en la BBC micro (Fig. 3.a. y 3.b.), una computadora basada en el microprocesador 6052 al igual que la Apple II. Desde su debut en 1981 en Gran Bretaña, la acogida de la BBC micro en las escuelas británicas como la "computadora educativa" fué total.  Inclusive se produjo una serie televisiva llamada "The Computer Programme" transmitida por la BBC que abarcaba topicos como programación, gráficos, sónido, teletexto, control de dispositivos de hardware externos e inteligencia artificial.


Fig 3.a. La BBC Micro


Fig 3.b. Pantalla de inicio de la BBC Micro: El intérprete BBC BASIC.

La historia de los primeros computadores personales la vivencié yo en los Estados Unidos, donde viví parte de mi infancia y mi adolescencia en la epoca de los 80.  Mi primera exposición al mundo de la programación fué a través de un cartucho para la consola de videojuegos Odyssey 2 llamado Computer Intro.  La lectura del manual que acompañaba este cartucho fué como una revelación para mi: hablaba de de una computadora hecha de engranajes diseñada por un tal Charles Babbage en el siglo XIX y la ENIAC, que ocupaba toda una sala con cables y tubos al vacio.  Contaba que los adelantos de la tecnología electrónica habían hecho posible que las computadoras estén en todas partes, cómo la cónsola Odyssey que tenía en mi sala.  Pero lo que más me llamó la atención fué cuando leí que las computadoras "hablaban" un lenguaje y que al aprenderlo, sería capáz de darle instrucciones a la máquina para que hiciera lo que yo quisiese.  ¡Imagínense! Esto era como el cuento de Aladino y el genio de la lámpara hecho realidad.  Inocentemente, yo me preguntaba si ese lenguaje que "hablaban" las computadoras sería como el inglés o el castellano...

Poco después, en el verano de ese mismo año (1983), me inscribí en un curso de vacaciones en mi escuela en donde aprendería a programar en un lenguaje llamado BASIC.  Cada niño tenía un computador de trabajo donde prácticabamos los comandos nuevos de BASIC que nos enseñaban diariamente.  Mis compañeritos y yo haciamos competencias para ver quien hacía el programa más impresionante: un cohete que despegaba y explotaba al otro lado de la pantalla, un juego de esquivar carros, etc. Sin saberlo, estaba aprendiendo sobre variables, funciones, coordenadas en el plano cartesiano, algoritmos, cómo resolver problemas descomponiendolos en sub-problemas más sencillos- en fín, todo lo que ahora denomiraría como "pensamiento computacional".  Sin duda, esto repercutió positivamente en otras áreas de mi formación intelectual, pero para mi en ese momento era sólo algo extremadamente divertido.  Era como un juego. Un hobby en el cual me "enganché" para siempre.

La programación era un hobby en el cual uno hacia las cosas uno mismo.  Se te ocurria una idea para un video juego o un programa que necesitabas para "automatizar" alguna tarea fastidiosa en la escuela (como por ejemplo para aprenderse de memoria nuevos vocablos en clase de Lenguaje) y lo hacias.  El único límite era tu propia creatividad.  Reflexionando en retrospectiva en torno a estas anecdotas, quisiera resaltar que: 1) Un niño podía aprender a programar y con ello desarrollar habilidades cognitivas asociadas al pensamiento computacional y matemático, como mi propia experiencia y la de centenares de miles de niños en esa epoca lo atestiguan, 2) programar era algo extremadamente divertido porque permitía desplegar la creatividad en proyectos significativos para quien aprendía (aprendizaje significativo), 3) a partir de un pequeño contenido impartido por un facilitador adulto, uno continuaba aprendiendo por su cuenta, altamente motivado por el deseo de llevar a cabo algún proyecto, como por ejemplo un video juego.  Esto es la esencia del aprendizaje constructivista, en el cual el deseo de "construir" algo motiva al estudiante a instruirse sobre el uso de las herramientas de construcción.  La computadora personal, a través del entorno de programación, es el material y la herramienta de construcción.

Existía en aquella época de los primeros computadores personales una cultura que favorecía el surgimiento de generaciones de niños programadores, a través de cursos de programación en las escuelas y revistas de computación con listados de programas que uno podía modificar a su antojo.  Sin embargo, esta era una cultura "underground", un movimiento cultural por y para jovenes programadores- "whiz-kids", "geeks" o "nerds", como les decian. En el afán de hacer estos aparatos cada vez más fáciles de usar y asequibles a la población en general, se desarrollaron sistemas operativos y aplicaciones con interfáces más amigables y gráficas.  Así surgieron las computadoras Macintosh y el sistema operativo Windows (que es una mala copia del MacOS).

Con este tipo de interfáz, el computador se hizo más fácil de utilizar para el usuario común.  Supongo que la idea era hacer el computador asequible para la abuelita, que sólo le interesaba usar el procesador de palabras sin tener que aprender esos "códigos complicados" de la programación.  En todo caso, las computadoras se hicieron más ubicuas pero a la vez, menos "personales".  Por una parte, para poder brindarle al usuario final todas esas ventanitas, todos esos íconos y los fastidiosos asistentes que aparecian cuando uno no los quería, los sistemas operativos se hicieron más complejos a la par del hardware, a tal punto que ya no era tan fácil para un niño desarrollar aplicaciones para ellos.  Por otro lado, ¿para qué se iba uno a tomar la molestia de aprender a programar si ya la gente de Microsoft y los de la Apple habían desarrollado aplicaciones con todas las funcionalidades que cualquier persona podría necesitar? Como resultado, cambió el enfoque en torno a la educación en tecnologías de información. Ya en las escuelas no se enseñaba programación, ahora se enseñaba como usar Microsoft Word, Excel, PowerPoint, Paint, ...

Se impuso una creencia según la cual programar es una actividad profesional para especialistas. Esta creencia ha permeado en varios ámbitos, en particular en el ámbito laboral.  En toda empresa o institución, existe un departamento de IT que se encarga de proveer y mantener las herramientas computacionales que requieran los demás departamentos.  En esta cultura de la especialización, no se espera que todo trabajador sea capáz de programar pero si se espera que el trabajador tenga ciertos conocimientos mínimos sobre el uso del computador.  Bajo este enfoque, los conocimientos sobre programación no son necesarios para poder usar el computador, de la misma manera que una persona puede aprender a manejar sin saber sobre mecánica automotriz, pero esta analogía es engañosa porque con un carro no realizamos nuestras comunicaciones, no manejamos nuestras cuentas bancarias, tramites gubernamentales y compras electrónicas.  Los carros no median nuestras relaciones sociales (Facebook, Twitter) ni cuentan los votos en un país (Smartmatic).  Un carro es solo una herramienta para desplazarse del punto A al punto B. Un computador es algo más.  El computador está intimamente ligado al proceso de la producción de ideas y de nuevos paradigmas sociales. El computador es una tecnología para producir tecnologías- es una tecnología madre por así decirlo.

Cási todas las herramientas tecnológicas que nosotros recibimos pasivamente ya vienen hechas, listas para ser usadas. El cuchillo con el que cortamos, el carro, la televisión- todos estos aparatos se pueden usar sin tener que hacerles modificaciones. Estos aparatos son interfaces que utilizamos para modificar nuestro entorno y puesto que ya vienen pre-determinados y no son modificables, se nos niega la posibilidad de desplegar nuestra creatividad para mejorar la forma en que operamos sobre nuestro entorno, según nuestros deseos y necesidades. Estamos tan acostumbrado a pensar así sobre los artefactos que usamos que nunca reparamos en el hecho que el computador es un artefacto de una naturaleza distinta: puede modificarse porque es programable.  Nunca reparamos en esto porque la cultura de las ventanitas (Windows) nos ha hecho ciegos a esta posibilidad. Hoy en día tenemos la web 2.0, en Facebook podemos comentar en el muro de un amigo, pero básicamente, estamos utilizando una interfáz creada por otros y son personas como Bill Gates, Steve Jobs y Mark Zuckerberg quienes en último termino deciden como debemos interactuar con nuestro mundo.

Esta visión Orwelliana del mundo dista mucho del futuro que como chamo me imaginaba que traería la revolución de las computadoras personales. Afortunadamente, existe una creciente cultura computista basada en el "hazlo tu mismo" como premisa fundamental.  Se llama Software Libre. La cara más visible de este movimiento de software libre es el sistema operativo Linux, en sus distintas versiones o distribuciones como se les denomina.  Incluido en toda versión de Linux hay un interprete de Python. Con el lenguaje Python se rescata la posibilidad de tener una plataforma sobre la cual crear nuestros propios programas o interfaces y volver a hacer de la computación una experiencia "personal" (o personalizable), como lo era antiguamente.

¿Es difícil aprender Python? Voy a responder esta pregunta de forma indirecta.  En el ambito de la programación, muy frecuentemente se hace referencia a los programas "Hola mundo".  Un programa "Hola Mundo" simplemente visualiza un mensaje de "Hola mundo!" en la pantalla.  Es algo así como el primer programa que hace uno cuando aprende a programar.  Para efectos de comparación, veamos un programa "hola mundo" en lenguaje ensamblador x86:

.model tiny
.code
org 100h

main  proc
      mov    ah,9                  
      mov    dx,offset mensaje_hola
      int    21h                   
      retn                         

mensaje_hola db 'Hola Mundo!$'

main  endp
end   main

A continuación el mismo programa pero en lenguaje C++:


#include <iostream>

int main()
{
    std::cout << "Hola Mundo!\n";
}

Y finalmente en Python (versión 2.x):

print "Hola mundo"

El lenguaje ensamblador es un lenguaje de muy bajo nivel (en el que la implementación de un programa está intimamente ligada a la arquitectura y el sistema operativo en el cual se va a ejecutar). Para empezar a explicar como funciona aquel programa "hola mundo" tendría que hablar sobre como en una máquina Von Neumann las celdas de memoria contienen datos y código, sobre como las instrucciones en el lenguaje ensamblador se corresponden a las instrucciones en lenguaje máquina mediante códigos hexadecimales, sobre los registros de un CPU, sobre la pila, el puntero de instrucción, las interrupciones...  Todo este conocimiento completamente inecesario para un usuario no especializado que quiere simplemente practicar el "hazlo tu mismo" en su computador.

El lenguaje C (y su variante C++) es un lenguaje de nivel intermedio (no tan ligado al hardware como el lenguaje ensamblador). De hecho, el lenguaje C es el lenguaje que se enseña en cási todas las universidades venezolanas. Esto a mi parecer es una política errada- yo personalmente no sabría justificar la enseñanza del lenguaje C a aquellos que nunca han programado.  Imagínense que en el primer día de clase el instructor coloca como ejemplo este programa "hola mundo".  Cualquier estudiante medianamente curioso preguntaría que hace la línea con el "#include" al principio.  Uno tendría que explicar que <iostream> es una librería de funciones encargadas de manejar la entrada/salida de la cónsola, que al ser incluidas junto al programa al momento de la compilación... Un docente responsable tendría que primero explicar que es un compilador y que significa eso de "código compilado".

Python es un lenguaje de muy alto nivel, porque el código en Python se parece más a las sentencias en lenguaje natural.  Una de las características más importantes de Python es que es dieñado para crear programas legibles por humanos.  Al ver un programa en Python, es fácil darse cuenta que es lo que hace.  Por ejemplo, el programa de "hola mundo" en Python simplemente imprime "Hola mundo!" en la pantalla (print significa imprimir en inglés).  Es algo muy intuitivo y fácil de entender para cualquier persona.  Por ser Python un lenguaje de muy alto nivel, es fácil crear aplicaciones rapidamente, aún cuando los programas no se ejecuten tán rápido como si fuesen hechos en lenguaje ensamblador.  Cómo los procesadores se han hecho tan rapidos y sin embargo el tiempo de un programador se ha hecho tan valioso (porque los programadores son un recurso cada vez más escaso), es fácil entender porqué el lenguaje Python forma parte de cualquier proyecto de Google.

Con Python es fácil crear aplicaciones para resolver problemas en el trabajo de manera ad hoc donde las herramientas comúnes de la ofimática no bastan.  Voy a ilustrar esto mediante un ejemplo de mi propia experiencia como docente de matemáticas en la Universidad Nacional Abierta.  En la UNA, existe un departamento en Nivel Central denominado SIUNA, que en conjunto con la Secretaría, mantiene todos los datos de control y registro de los estudiantes inscritos semestre tras semestre.  A mi como profesor me interesa tener un listado de los alumnos que yo asesoro en cada materia en las distintas sedes de la Universidad en el Centro Local de Anzoátegui, pero desafortunadamente, la aplicación del SIUNA no genera tal listado.  Lo que el sistema SIUNA si genera es un listado completo de todos los alumnos inscritos en el Centro Local de Anzoátegui con información sobre sus datos personales, la sede en donde están inscritos, y las materias que inscribió.  Es un listado largo de más de 30 páginas en formato PDF. A mi me interesaría extraer a partir de ese documento varias hojas de calculo, cada una con el listado de los alumnos que yo asesoro en mis materias y de las sedes que me corresponden.  ¿Cómo harían eso ustedes en Word, Excel, o Acrobat Reader?

Yo opte por escribir un pequeño script en Python que toma el archivo PDF y lo convierte a un archivo de texto plano, que a su vez es procesado varias veces para generar las hojas de cálculo con las nominas de alumnos que me toca asesorar en cada una de mis materias.  Con un poquito más de sofisticación, se que podría generar un solo libro Excel (Openoffice Calc, perdón) con varias hojas, una por materia y los formatos listos para vaciar los resultados de las evaluaciones académicas de cada estudiante.  De hecho, Python tiene montones de módulos, o librerias, que me permiten ampliar la funcionalidad del lenguaje para generar archivos de Excel, por ejemplo.  Piensen un poco sobre el trabajo tedioso que me ahorro cada semestre, si tuviese que generar esos listados a mano.  No solo ahorro mi tiempo, sino también el de mis colegas profesores de la sede a quienes, modificando mi script un poco, también les genero sus listados con solo apretar un botón.  La moraleja de esto es que eventualmente se presentará alguna ocasión en el trabajo para la cual las herramientas de computación son inadecuadas, debido a que los desarrolladores de esas herramientas no han podido preveer todos los requerimientos particulares de cada usuario.  Para estos casos, definitivamente es una ventaja saber programar en Python.  Y lo mejor es que uno puede "hacerlo uno mismo", sin tener que esperar a los especialistas de SIUNA (o del departamento IT de la empresa donde Ud. labora).

Es de pensar: ¿porqué las empresas no invierten en entrenar a su personal para que este pueda satisfacer sus requerimientos de informática en vez de desplegar un departamento de IT que de todas formas nunca tiene tiempo para satisfacer los requerimientos de los demás departamentos? Pero pensemos un poco más atrás en la cadena: ¿porqué no se hace esto desde las universidades? Y aún más atrás en la cadena: ¿porqué no comenzamos a hacer esto desde la educación primaria? 

En algunos paises desarrollados, hay quienes piensan que el los curricula de Tecnologías de Información necesitan revisión.  Un efecto visible de esto es que paradójicamente, cada vez hay menos egresados de la secundaria que prosiguen estudios de computación en la universidad y este problema de reclutamiento obviamente está comenzando a afectar a la industria. El gobierno británico ha tomado pasos orientados a "volver al futuro"- impartir nuevamente la enseñanza de las "ciencias de la computación" en la escuela primaria, lo cual sería una especie de relanzamiento del antiguo programa de las BBC micros.  Excepto que ahora la BBC micro sería este aparato, denominado "Raspberry Pi":


Fig. 4. Raspberry Pi.

La Raspberry Pi, con un costo de 35$, es un computador minimalista del tamaño de una tarjeta de crédito.  Incluye un procesador ARM, 2 puertos USB, un puerto ethernet, 256 MB de memoria RAM y por dispositivo de almacenamiento secundario utiliza una tarjeta micro SD con el sistema operativo ya grabado, que en este caso es el Debian squeeze (una distribución de Linux). Por cierto, no se les puede instalar Windows porque no hay ninguna versión compilada para el procesador ARM que usa la máquina. Adicionalmente, viene lista para trabajar en clase con el interprete de Python.  Python viene a ser para las nuevas generaciones de niños programadores lo que era el lenguaje BASIC de las viejas BBC micros.

La Raspberry Pi británica invita a una comparación con las Canaimitas que se le dan a los alumnos de primaria en Venezuela. Más que comparar las características de cada equipo de computación, lo cual sería completamente irrelevante para el tema de este artículo, lo que se pretende es comparar los proyectos educativos de los respectivos paises en materia de Tecnologías de Información. A partir del año 2011, ha comenzado en el seno del gobierno y la sociedad británica un intenso debate sobre la reforma del curriculum escolar en materia de las Tecnologías de Información.  Hasta ahora, dicho curriculum estaba orientado a lograr la "alfabetización digital", es decir, la habilidad para usar procesadores de palabras, hojas de cálculo y el internet de manera segura y efectiva.  Este enfoque orientado hacia entrenar usuarios/operadores de computadoras ha tenido como resultado la perdida de competitividad de Gran Bretaña como país productor de Tecnologías de Información.  En palabras de Eric Schmidt, presidente de Google, en una charla en la Universidad de Cambridge (2011):

"Me he quedado pasmado al enterarme que hoy en día, las ciencias computacionales no forman parte de los contenidos impartidos en las escuelas británicas.  Vuestro curriculum de TIC se enfoca en enseñar cómo usar software, pero no en cómo producirlo."

Hoy en día, la opinión según la cual las ciencias computacionales deben enseñarse como cualquier otra disciplina académica (matemáticas, lenguaje, historia, biología, etc.) está ganando terreno en Gran Bretaña. Entre otras cosas, las ciencias computacionales engloban la lógica, resolución de problemas y la capacidad de análisis y desarrollo del pensamiento riguroso y crítico, lo cual justifica su valor educativo y su inserción como parte del curriculum.  Aunque la tecnología de la computación cambia constantemente, los principios sobre los cuales se fundamenta permanecen invariables, por lo cual las ciencias computacionales son realmente una disciplina.  Por otro lado, es una disciplina de enorme importancia económica que repercute profundamente en todos los aspectos de la sociedad. Esta disciplina ha incursionado en otras, como la biología.  Por ejemplo, algunos biologos consideran las celulas como automotas programados por DNA, mientras otros utilizan modelos computacionales para entender la biodiversidad y la dinámica de las poblaciones de seres vivos.  Desde un enfoque basado en las ciencias computacionales se puede comprender mejor ciertos asuntos sociales como los sistemas modernos de comercio financiero y los sistemas de votación electrónicos.

El proyecto educativo Canaima por otra parte "tiene por objetivo general, promover la formación integral de los niños y niñas venezolanos(as) mediante el aprendizaje liberador y emancipador apoyado en las Tecnologías de Información Libres". Entre sus objetivos especificos resaltan los siguientes:

• Transformar la praxis docente con el uso humanista, crítico y creativo de las Tecnologías de Información Libres.

• Desarrollo de potencialidades en Tecnologías de Información Libres para el apoyo a los procesos educativos en pro de la soberanía y la independencia tecnológica.

El apoyo a los procesos educativos se operacionaliza mediante el desarrollo de contenidos multimedia ofrecidos como paquetes, según el grado escolar, a ser instalado en las Canaimitas, unas computadoras tipo mini con el Linux Canaima pre-instalado. Los contenidos multimedia versan sobre las distintas áreas del curriculum de la primaria en venezuela, a saber: lenguaje y comunicación, ciencias naturales, ciencias sociales e historia, cultura, actividad física, deporte y recreación.

El proyecto Educativo Canaima no contempla la enseñanza de las Ciencias Computacionales ni de las destrezas propias de esta disciplina. El rol de las Canaimitas es de servir de apoyo a la enseñanza, es decir, como un medio instruccional alternativo, no para apoderar a los estudiantes en la producción de su propia tecnología, con lo cual se está perdiendo un potencial interesante para lograr una verdadera soberanía e independencia tecnológica.  Se está perdiendo una oportunidad de enseñar a los niños venezolanos a "hacer las cosas uno mismo", que es la esencia de la filosofía del Software Libre. Es una verdadera pena, considerando que como todo sistema Linux, las Canaimitas también proveen un interprete Python.  Finalmente, quisiera cerrar estas notas con una cita de Simón Rodriguez, para que cada quien lea entre líneas:

            “Enseñen y tendrán quien sepa, eduquen y tendrán quien haga”.




Bibliografía

Attwood, J. (2012). "Please don't learn to code". Entrada de Blog "Coding Horror" de 15/05/2012. http://www.codinghorror.com/blog/2012/05/please-dont-learn-to-code.html.

Computing at School Working Group. (2012). "Computer Science as a school subject - Seizing the opportunity". [Documento en línea disponible en: http://www.computingatschool.org.uk].

Gobierno de la República Bolivariana de Venezuela. (2009). "Orientaciones Educativas- Canaima Educativo". [Documento en línea disponible en: http://www.slideshare.net/latingirl/orientaciones-canaimaeducativo].

Haggard, D. (2011). "Why Everyone Should Learn to Program". Reviews in Depth. [Documento en línea disponible en: http://reviewsindepth.com/2011/04/why-everyone-should-learn-to-program/].

Kirschenbaum, M. (2009). "Hello Worlds (why humanities students should learn to program)". Articulo en Chronicle Review, 23/01/2009. Disponible en http://chronicle.com/article/Hello-Worlds/5476.

Naughton, J. (2012). "Why all our kids should be taught how to code".  Guardian Weekly. [Documento en línea disponible en: http://www.guardian.co.uk/education/2012/mar/31/why-kids-should-be-taught-code].

sábado, 14 de julio de 2012

Contando con el hombre planeta

Viendo que ustedes presentaron unos video juegos, no quise quedarme yo atrás y me puse manos a la obra para elaborar el mío propio.  El video juego que les presento ahora se llama "Contando con el Hombre Planeta" (este es su enlace de descarga).

Es un juego para reforzar el aprendizaje de mi hija Raquel de cuatro años, para que aprenda a contar.  De hecho, la figura del hombre planeta (el muñeco que parece una papa) y la de los pájaros fueron diseñadas por ella.  Simplemente escanee los dibujos en papel y los calqué con Gimp, agregandole yo mismo los colores según las indicaciones de mi hija.

Este juego tiene una particularidad: hace uso de la librería espeak, la cual deben descargar de synaptic (tienen que descargar el paquete espeak e espeak-python, que contiene los python bindings).  Esta librería es para poder darle a sus programas capacidad de sintesis de voz.  De hecho, el hombre planeta es capaz de contar en tres idiomas: español, inglés y francés.

Ustedes pueden colocar en el script el nombre del niño y el código del idioma que quieren usar: "ES","EN" y "FR" para español, inglés y frances respectivamente.

lunes, 9 de julio de 2012

Pygame en dos platos (o tres o más)

Lo Básico


Esta sería la estructura básica de un video juego implementado con Pygame:

01:    #!/usr/bin/env python
02:    # -*- coding: utf-8 -*-
03:    import sys, pygame
04:    pygame.init()
05:    #define las dimensiones y crea la ventana (pantalla)
06:    dimensiones = ancho, alto = 640, 480
07:    pantalla = pygame.display.set_mode(dimensiones)
08:    #define la velocidad del juego
09:    reloj = pygame.time.Clock()
10:    CUADROS_POR_SEGUNDO = 60
11:    #ciclo principal del juego
12:    while True:
13:        reloj.tick(CUADROS_POR_SEGUNDO)
14:        for event in pygame.event.get():
15:            if event.type == pygame.QUIT:
16:                sys.exit()

Comenzaré por comentar sobre las líneas 1 y 2.  La línea uno se incluye para convertir nuestro código en ejecutable bajo linux.  A pesar de que es un comentario, se indica en él el la ubicación del interprete python- esto es notación estándar para cualquier script en bash o python.  Para poder correr nuestro programa al hacer click sobre él, deberiamos marcar en sus propiedades que es ejecutable.  La segunda línea indica que estamos usando codificación utf-8.  Esta códificación es universal, para que nuestro juego no tenga problemas bajo ninguna plataforma con los acentos, las eñes, etc.  He visto que algunos de ustedes (particularmente los que tienen juegos copiados) no incluyen esta línea de comentario en sus scripts y a mi, no sé si a otros, me ha dado problemas al correrlos.

Después de importar los módulos necesarios para nuestro video juego en la línea 3 (casi siempre son esos dos), inicializamos el módulo pygame en la línea 4.  Al hacer esto se inicializan todos los submodulos que necesiten inicialización.  De modo tal que luego de invocar a pygame.init() no es necesario inicializar el módulo font de pygame con pygame.font.init, por ejemplo.

Las líneas 6 y 7 inicializan la pantalla, con lo cual se crea una ventana pygame sobre la cual eventualmente se desplegará el juego.  Nótese que la expresión "640, 480" en la línea 6 es una tupla de python, de modo que la variable "dimensiones" es una tupla.  Sin embargo, en la misma línea tambien estamos asignandole a las variables escalares "ancho" y "alto" los valores 640 y 480 respectivamente.  Esto es una de las particularidades de las asignaciones en python.  En la línea 7, hemos podido haber indicado otro parámetro en la función set_mode, como sigue:

            pygame.display.set_mode(dimensiones, FULLSCREEN)

Con esto tendriamos una ventana que ocupa la pantalla completa, en vez de ser sólo una ventana propiamente.  Otros parametros son:

DOUBLEBUF: que se usa para darle un aspecto de mayor continuidad a las animaciones.  Sin embargo, requiere invocar la función "flip" (como en pygame.display.flip() ) para acutalizar la pantalla en cada ciclo.
OPENGL: para rendición de escenas tridimensionales con PyOpenGL.  Sin embargo, con este parámetro no se permitirá utilizar la mayoría de las funciones de dibujo de Pygame.

Los parámetros se pueden indicar se a varios a la vez en set_mode.

Las líneas 9 y 10 definen el reloj, el cual a su vez marca la pauta de cuán rápido correrá nuestro juego.  La velocidad se mide en cuadros por segundo.  Se dice que el ojo humano no percibe cambios a velocidades mayores a 30 cuadros por segundo, pero cómo el computador tampoco ejecuta todas las instrucciones en el ciclo de juego instantáneamente, quizás sea necesario fijar una velocidad mayor.

A partir de la línea 12 se tiene el ciclo principal del video juego.  Durante todo el ciclo, nuestro programa no responderá a entradas por la cónsola, por lo cual hay que tomar previsiones para recibir las entradas del usuario y poder salir del programa.  En el ciclo de juego se despliega toda la acción del juego.  Esto incluye las animaciones, la detección de colisiones y otros eventos, la actualización del nivel, las vidas, la pantalla, etc.  Es de notar que en nuestro ejemplo de esqueleto, solo realizamos dos acciones dentro del ciclo principal en las líneas 13 y 14-16.  La línea 13 es una invocación a la función tick(), lo cual hace que nuestro programa haga una pausa de tantos milisegundos como sea necesario para que el juego corra a la velocidad indicada por nosotros en cuadros por segundo.  Lás lineas 14 a 16 verifican si ha ocurrido un evento de tipo "Quit", con lo cual nuestro programa finalizaría.

En lo que sigue veremos como desarrollar la acción de nuestro video juego.  Esto incluye el concepto de "superficie", el "blit" y los "sprites", con lo cual podemos implementar las animaciones de figuras sobre un fondo en el video juego.

Referencias


  • Jones, R. (2007). "Rapid Game Development in Python". Documento en línea.
  • Shinners, P. (2002). "Pygame Tutorials".  Disponible en instalación de pygame, para el caso linux, en el directorio usr/share/pyshare/pygame/docs.
  • Sweigart, A. (2010). "Invent Your Own computer Games with Python". 2nda Edición.


domingo, 8 de julio de 2012

Honestidad



Hola a todos:

Quisiera hablarles en esta oportunidad de un valor que no es muy frecuente en estos dias, pero que sigue siendo un valor importante: la honestidad.

Creo que he hablado bastante en clase sobre la importancia de no atribuirse la autoría de algo que uno no hizo.  Sin embargo, quiero enfatizar que eso no significa que uno debe hacer todo uno mismo.  Python, Pygame, los libros y programas de otros autores, todas son cosas no hechas por nosotros sobre las cuales nosotros construimos nuestro propio material.  Ciertamente, yo no inventé Python o Pygame, pero nunca me he atribuido la autoría de algo que yo no hice. También es cierto que a lo largo del curso he utilizado o me he basado en material no hecho por mi, pero siempre he tratado de citar al autor o dar crédito al trabajo de otros.  Lo mismo espero de ustedes.  No citar la autoría de algo que uno no hizo y presentarlo como su propia creación es extremadamente ofensivo y deshonesto, sobre todo en el mundo del software libre y del código abierto.  Por otro lado, a nadie le gusta que lo engañen porque se siente uno como si los demás lo toman por tonto.

Yo no tengo problemas en que ustedes usen el código de otros, siempre cuando den cŕedito a su verdadero autor.  Como nuestros fines son educativos/instruccionales (queremos aprender a programar en Python/Pygame, ¿recuerdan?), yo esperaría que en ese caso, ustedes se hayan tomado el tiempo de realizar el esfuerzo de entender cómo el verdadero autor crea el juego que ustedes presentan.  Además, se esperaría que ustedes sepan explicarselo a sus compañeros para que todos podamos beneficiarnos de ese conocimiento.

En el caso del juego de "Invasión y Batalla", este es una copia textual de un juego creado por PyMike llamado "Helicopters".  Su enlace de descarga es http://pymike.aftermatheffect.com/games/helicopters-1.2.zip.  A continuación una captura del juego:




Lo elegante hubiese sido ser honestos, ¿no creen? Ahora quiero que revisen las preguntas que les hice anteriormente y las respondan realmente.  No quiero respuestas llenas de palabras y errores pero ultimadamente vacias y que no responden las preguntas.

El proyecto de la documentación de Pygame está bien presentado, pero los últimos ejemplos de "hola mundo" con ventanas en Pygame son una traducción del libro "Invent Your Own Computer Games with Python", de Al Sweigart (capitulo 17, para ser exactos).  No esta mal que usen otras referencias, pero por favor, cítenlas.  Uds. saben que yo odio el plagio.  Además, no tiene nada de malo citar fuentes, pues ustedes estan presentando la información en castellano y en un formato distinto- la idea es llenar un vacio de documentación que explique de manera sencilla cómo desarrollar un video juego en Pygame.

Qusiera que quienes hayan presentado juegos o material hecho por otra persona den un paso al frente y den crédito a la autoría externa.  Vamos a sincerarnos.  Ello implica también que debemos de revisar los criterios de evaluación- cosas como "originalidad", "diseño", etc. ya no tienen sentido cuando se está presentando el trabajo de otro.  Recuerden: si logran aunque sea entender como fue elaborado el juego que presentan y explicarselo a los demás, se habrá logrado el objetivo del curso.  En eso, cada quien puede poner de su parte en este foro.

sábado, 7 de julio de 2012

Destruye el ladrillo




Introducción


Destruye el ladrillo es un juego parecido a "breakout". La página del juego es http://juegodelladrillo.es.tl/



Los integrantes de este equipo son:

  • JOSARETH RODRIGUEZ
  • BARBARA MADRID
  • JOSE LUIS FIGUEROA
  • MAGNELVIS ROLDAN
  • OSMAR GARCIA

Reseña


El juego Destruye el lLadrillo fue realizado utilizando Python/PyGame. Dicho juego posee diferentes funciones que se programaron para tener el resultado final. De igual manera se aplicaron colisiones, las cuales fueron de mucha importancia ya que la función collidelist verifica si la pelota (arma) chocó con alguno de los ladrillos y en caso tal, regresa el número de ladrillos contra los cuales se impactó o regresa un -1 en caso contrario (no hubo colisiones). En caso de haber colisionado, destruimos el ladrillo.

Referencias


Ellos citan como fuentes de información lo siguiente:

  1. chelintutorials.blogspot.com En este sitio web pudieron encontrar mucha información desde cómo crear un juego en Pygame desde cero, así como también diferentes tutoriales de Pythony que fueron de gran ayuda para ellos.
  2. http://razonartificial.com/tag/pygame/ En este sitio encontraron variedad de información y un juego llamado Arkanoid, el cual es parecido a Breakout.
  3. http://www.losersjuegos.com.ar/traducciones/pygame En este sitio encontraron la documentación oficial de PyGame traducida al español.

jueves, 5 de julio de 2012

Aventuras en busca de El Dorado

Hola a todos:

Esta es la reseña sobre el juego de "Aventuras en busca de El Dorado", el cual es el juego del equipo conformado por:

Pinto Leonor
Laya Oscar
Rondon Elieser
Urbano Leober
Velasquez Edibel
Vásquez Daniel

La página de su juego es la siguiente: http://aventuras.vzpla.net/personajes.html

Pido disculpas por lo breve de esta reseña- el trabajo de estos muchachos se ve muy prometedor y no se merecen una reseña tan chimba pero como saben estoy sin internet en la casa y tuve que ir a un ciber donde solo hay Guindous con Internet Explorer.  Esta basura de navegador no es compatible con Blogger y creo que voy a dejar esto hasta aqui porque de repente me dio nauseas y tengo ganas de vomitar ....  Bllaaaaarrchhhhh

martes, 3 de julio de 2012

Un parentesis ...

Hola a todos:

En estos días he estado sin internet en la casa, pudiendo conectarme apenas hoy desde la universidad.  Sin embargo, veo con preocupación que no ha habido novedades en cuanto al trabajo de cada equipo.  Evidentemente, mi preocupación se debe al corto plazo de tiempo que tenemos en lo que resta de este semestre.  Entienden que el trabajo de el videojuego vale el 60% de la nota?

Pero aparte de la nota, lo que a mi parecer es más grave es que estamos desaprovechando una excelente oportunidad para aprender colectivamente lo que implica la creación de un video juego.  Esta parte final es la parte más emocionante del curso, pero no veo animos de aprovechar la coyuntura. Será que los compañeros del curso pasado estaban mejor preparados que ustedes, y pudieron a pesar de todo desarrollar sus respectivas propuestas?

Trataré de conectarme luego.  Cuando lo haga espero ver el blog rebosante de comentarios y las propuestas de cada equipo (el código muchachos, el código) disponibles para su descarga en los respectivos blogs.

Efectos de Consola, Parte 4

En la entrada pasada vimos cómo crear animaciones y controlar los colores y otros atributos de visualización en modo texto usando secuencias de escape ANSI. En esta entrada veremos cómo utilizar una librería llamada libcaca que he portado a Python en forma castellanizada. La librería la deben instalar desde synaptic y los bindings de Python los deben descargar por aqui.

En esta entrada les traigo un pequeño script de un poco más de 100 lineas implementando el famoso juego de la culebra (recuerdan, el que venía en los Nokia?), pero en modo texto.  Ustedes pudiesen implementar su propia librería de visualización en modo texto usando secuencias de escape ANSI, pero las ventajas que ofrece libcaca es que permiten crear ventanas aparte, controlar eventos con dispositivos de entrada (ratón, teclado, etc.), etc.


El código para este juego lo pueden descargar por aqui.  Cuando vayan a correrlo, asegúrense de tener "caca.py" en el mismo directorio.  O instalen uds. mismos caca.py en /usr/local/... no-se-que-diablos para disponer de esta librería en todo momento.

Post-data: he probado el juego en python 2.7 pero hay problemas en la detección de eventos de presionado de teclas con libcaca. No sé si esto tenga que ver con la falta del paquete libcacadev (?).  En todo caso, no me he puesto a resolver este problema con detenimiento aún.

viernes, 29 de junio de 2012

Metal of Fire

Metal of Fire, o Metal de Fuego, en palabras del équipo:


Es un juego de acción del tipo arcade, basado en el video juego de GALAXI (1981) desarrollado por la compañía namco para las consolas Atari 2600, Atari 7800, Arcade, Commodore 64, Famicom Disk System, J2ME, MSX, Xbox 360, Nintendo Wii. Tenía como objetivo controlar una nave que debe enfrentarse contra un enjambre de marcianos que le atacarán disparando bombas y actuando como kamikazes. Éste es uno de los primeros juegos con un nivel de bonus, además fue continuado y mejorado con el tiempo y en varias versiones en diferentes consolas de video.
La finalidad de METAL OF FIRE es controlar nuestro avión (Zukhoi) de un lado a otro de manera horizontal (de izquierda a derecha) evitando y atacando a los aviones enemigos de manera tal que cada vez que eliminemos a todos podamos subir de nivel. Cada nivel que se aumente vendrá acompaño de un grado más de dificultad para el usuario, ataques más constantes y más veloces y aviones contrincantes. METAL OF FIRE representa otra versión más de este grandioso juego que rompió barreras en la modalidad de acción y tripulación de una aeronave, invitamos a la comunidad de programadores de pygame en el mejoramiento y continuación de él.


¡Que gratos recuerdos cuando mencionaron la Commodore 64 y el Atari 2600!

El équipo está integrado por:

  • Mirianni Medina
  • Feliz Verde
  • Anthony Silva
  • Kenner Muñoz
  • Argenis Mata
  • Wuilder Bravo

Y la página web es http://metaloffires.blogspot.com/ .

Invasión y Batalla

Los muchachos de Invasión y Batalla me hicieron llegar la información sobre el blog de su juego.  Dicho juego será colgado en http://invasionybatalla.blogspot.com/ .  Los integrantes de este equipo son:

  • Amundarain, Darcy
  • Cordoba, Pedro
  • Oropeza, Jesús
  • Obregon, Walter
  • Rodriguez, Jessica
  • Vielma, Lismar
A continuación una captura de pantalla y una breve reseña del videojuego tomada textualmente de su blog:


INVASION Y BATALLA... ES UN VIDEO JUEGO DE ACCION BASADO EN UN PAISAJE NATURAL, LA ESTRATEGIA CONSISTE EN DERRIBAR LOS HELICOPTEROS QUE VAN SOBREVOLANDO EL AREA, PARA ELLO EXISTE UN SOLDADO DE COMBATE QUE DEBE IMPEDIR LA INVASION Y EL BOMBARDEO DE SU TERRITORIO ATACANDO CON SU ARMA PARA TRATAR DE ELIMINAR LA MAYOR CANTIDAD POSIBLE DE HELICÓPTEROS Y BOMBAS QUE VAN DISMUYENDO LA VIDA DEL SOLDADO. MIENTRAS MAS SE ELIMINEN LOS INVASORES SE OBTENDRÁ MAS PUNTAJE Y AUMENTARA DE NIVEL. ES MUY FACIL DE JUGAR, AL EJECUTAR EL VIDEO JUEGO SOLO TIENES QUE PRECIONAR CUALQUIER TECLA PARA EMPEZAR LA DIVERSION. PARA EMPEZAR A DISPARAR SOLO NECESITAS EL MOUSE Y HACER MUCHOS CLIC, Y SI DESEAS SALIR DEL JUEGO SOLO PRECIONA LA TECLA "ESCAPE" 

miércoles, 27 de junio de 2012

Un correo esoterico revelado (Parte 2)

Para no dejar este problema inconcluso, doy a continuación su solución.

Primeramente, la data textual del correo cifrado, que se encuentra dispuesto en grupos de 8 cifras binarias, nos hace sospechar que cada octeto de bits representa un caractér ASCII.  El problema consistiría en leer este archivo e ir conviertiendo cada número de 8 bits a su correspondiente caracter ASCII. La cadena de todos estos caracteres sería el correo decifrado.

En segundo lugar, observamos que cada octeto de bits está separado por un espacio.  Entonces tenemos que leer el archivo y descomponerlo en una lista de octetos, cada uno de los cuales a su vez será convertido a un valor numérico que será el código ASCII del caractér en cuestión.

Sin más preámbulos, damos una primera solución:


#!/usr/bin/python
# -*- coding: latin-1 -*-
archivo=open("correo_esoterico.txt","r")
decifrado=""
for i in archivo:
    lis=i.split(" ")
    for j in lis:
        decifrado+=chr(int(j,2))
archivo.close()
archivo=open("decifrao.txt","w")
archivo.write(decifrado)
archivo.close()

Observen que el método split divide una cadena en una lista de cadena, donde se supone que el punto de división (caractér separador) es el espacio " ".  Observen también que la función int convierte una cadena a un número entero, donde también podemos indicar la base de representación numérica, que en este caso es 2 (números binarios).  Por último, la función chr retorna el caracter correspondiente al código numérico indicado en su argumento.

Alternativamente, podemos ahorrarnos todos esos for y trabajar con la programación funcional:

#!/usr/bin/python
# -*- coding: latin-1 -*-
archivo=open("correo_esoterico.txt","r")
cifrado=archivo.read().split(" ")
decifrado="".join([chr(int(x,2)) for x in cifrado])
archivo.close()
archivo=open("decifrao.txt","w")
archivo.write(decifrado)
archivo.close()

Quedan advertidos: el mensaje que me envió mi amigo (una vez decifrado), es burda de cursi, pero por lo menos nos sirvió para practicar  Python.

PyGame con sabor venezolano

Hola a todos:

Esta entrada del blog se corresponde a la reseña del equipo que está elaborando un material instruccional sobre Python/PyGame. En palabras del grupo, se pretende elaborar una "documentación clara y sencilla de introducción a python y los juegos que puedes realizar sin necesidad de usar pygame, como crear un video juego usando pygame y todas las soluciones del curso pasado a las dudas que tuvieron en el curso, dejarlas plasmadas en una sola documentación".  Los integrantes de este equipo son:

  • Quintero Sor Mary
  • Sanchez Ensor
  • Romero Hector
  • Colaiacovo Maria Fernanda
  • Mondello Giovanni

Esto es un trabajo en progreso, cuyos capitulos se iran colgando la siguiente página:



domingo, 27 de mayo de 2012

Un correo esotérico, parte 1

Habiendo mencionado un poco sobre la lectura/escritura de archivos de texto, les puedo proponer un simpático problema de programación que pueden resolver utilizando los conocimientos de Python que se han dado hasta ahora en este blog.

Un amigo mío me mando un día el siguiente correo:

:
:
:

El correo original consta de 22 páginas de ... ¡ceros y unos!  Pueden descargar el archivo de texto con la secuencia de dígitos binarios en este enlace.  La misión de ustedes será hacer un script en Python para "decifrar" esta secuencia de ceros y unos.  Quiero que observen lo siguiente:
  • Los ceros y unos están agrupados en grupos de 8 bits (cifras binarias).
  • Cada grupo de 8 bits seguramente representa algo... ¿Una letra o un caracter?
  • ¿Cómo representámos caracteres y letras en un computador? ¿Cuál sistema de codificación se usa más frecuentemente?
Traten de decifrar el mensaje antes de que yo publique el script para decifrarlo como siguiente entrada de este blog.




Archivos de texto

En esta entrada veremos como trabajar con archivos simples en python.  El tipo más simple de archivos es sin duda el archivo de texto.  Un archivo de texto es una sucesión de caracteres organizada en secuencias de líneas que reside en "algún lugar" de un dispositivo de almacenamiento secundario (disco duro, pen drive, cd rom, etc.) y al cual podemos acceder mediante su ruta.  La ruta es el camino en la jerarquía de directorios que indica de manera univoca en que parte de cual dispositivo de almacenamiento secundario reside el archivo. 


Un poco sobre las rutas de archivos


En linux, la raiz de toda ruta es "/". A partir de allí se indican los directorios y subdirectorios sucesivos separando los mismos mediante la barra diagonal "/". Por ejemplo,

/home/jlaurentum/Documentos/nota.txt

sería la ruta completa de un archivo llamado "nota.txt" que reside en el disco duro de mi computadora.  Notese que el elemento final de la ruta es el nombre del archivo en sí y que los archivos tienen terminaciones o sufijos que se indican despues del punto "." en su nombre.  Así, algunas terminaciones comunes son ".tex", ".odt", ".bin" que van asociadas a los archivos de LaTeX, Libre Office Writer y programas ejecutables en Linbux respectivamente.  Un sufijo de nombre de archivo particularmente importante para nosotros es ".py", el cual denota archivos de código fuente en Python, los cuales por cierto son archivos de texto tambien.

En Güindou$, el caracter separador de directorio en las rutas es la barra diagonal invertida "\".  Para especificar la raiz, hay que identificar el dispositivo de almacenamiento o la partición del disco duro mediante una letra seguida de ":".  Así por ejemplo, en la computadora de mis esposa (que es Guindou$-dependiente), tengo un archivo cuya ruta es:

C:\Mis documentos\jlaurentum\nota.txt

Yo evito usar espacios y caracteres raros en los nombres de mis directorios o de mis archivos.  Para separar las palabras de un nombre, utilizo el caracter de piso "_" o el guión "-" en vez del espacio " ".  Bueno, con esto estamos listos para ver cómo se trabajan con archivos en python.

El protocolo de trabajo con archivos de texto: abrir, leer/escribir y cerrar


Desde el punto de vista de programación en Python, podemos ver los archivos como objetos.  Cuando creamos una instancia de tipo archivo (mediante la sentencia open), indicamos la ruta del archivo y el modo de acceso al archivo, siendo este:

  • de escritura, indicado por "w" en el argumento modo de open.  Sólo será posible escribir al archivo.  Si no existe el archivo en la ruta, al abrirlo se crea.
  • de lectura, indicado por "r" en el argumento modo de open.  Sólo será posible leer el arhivo.
  • para anexar, indicado por "a" en el argumento modo de open.  Se podrá escribir sólo al final del archivo, sin modificar el contenido existente.
  • de lectura/escritura, indicado por "r+" en el argumento modo de open.  Se podrá leer y escribir al archivo.
Existen otros argumentos para modo, pero con estos basta.  Si abrimos un archivo para lectura pero este no existe en la ruta proporcionada, se genera un error.  Por ejemplo, vamos a suponer que me equivoco al escribir el nombre de nota.txt y escribo nata.txt (el cual no existe). Entonces, al abrir el archivo en Python, tendría un error:


>>> mi_archivo = open("/home/jlaurentum/Documentos/nata.txt","r")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No existe el archivo o el directorio: '/home/jlaurentum/Documentos/nata.txt'
>>>


En otro post veremos como acceder a algunas funciones del sistema operativo verificar si un archivo existe, obtener un listado de archivos en un directorio, etc.  Supóngase pues, que "nota.txt" es un archivo de texto que contiene lo siguiente (puedes copiar y pegar este archivo y guardarlo en tu computadora para hacer las pruebas):


Este es un archivo de prueba.
Esta es la segunda línea.
Y esta es la tercera línea.


Intentamos una vez más abrir el archivo (habiendolo guardado previamente en la ruta que indicamos):


>>> mi_archivo = open("/home/jlaurentum/Documentos/nota.txt","r")
>>>


¡Éxito!  Notese que el método open, cuando es exitoso, crea una instancia nueva de la clase file (archivo). Así, mi_archivo es un objeto tipo file:

>>> type(mi_archivo)
<type 'file'>
>>>



Una vez que abrimos un archivo para lectura, estamos listos para acceder a él.  Vamos a visualizar el contenido de "nota.txt" con el siguiente script:


>>> for linea in mi_archivo:
...     print linea
...
Este es un archivo de prueba.

Esta es la segunda línea.

Y esta es la tercera línea.

>>>


Observen la sentencia for- es bastante elocuente para entender que python "vé" los archivos de texto como una secuencia de líneas.  Sin darnos cuenta, ya hemos leido todas estas líneas e inclusive las hemos imprimido. Pero ... algo anda mal. ¿Porqué hay un espacio adicional entre las líneas?  Resulta que cada línea en el archivo original termina en "\n", que es el caracter invisible que indica una nueva línea.  Cuando se imprime el "\n" al final de cada línea, se imprime un salto de línea adicional al salto de línea que imprime la sentencia print.  Por eso tenemos el interlineado de arriba.  Para corregir esto, lo que tenemos que hacer es eliminar el caracter final de cada línea cuando este es un "\n".  Sin embargo, tenemos que volver a abrir el archivo nuevamente porque en el último for lo leimos todo hasta el final:


>>> mi_archivo=open("/home/jlaurentum/Documentos/nota.txt","r")
>>> for linea in mi_archivo:
...     if linea[-1]=="\n":
...             linea=linea[:-1]
...     print linea
...
Este es un archivo de prueba.
Esta es la segunda línea.
Y esta es la tercera línea.
>>>


¡Qué éxito! Pero se nos ha olvidado algo muy importante: cerrar el archivo tras haber trabajado con él:


>>> mi_archivo.close()
>>>


No se puede repetir lo suficiente lo importante que es cerrar los archivos al final.  Si no lo hacemos, los cambios que hacemos al archivo en modo escritura se pueden perder o peor aún, el archivo puede corromperse y quedar inservible.

Ahora vamos a probar la escritura de archivos.  Normalmente, cuando yo quiero procesar el contenido de un archivo, lo que hago es abrir una copia en modo lectura y crear otro archivo en modo escritura al cual voy a escribir el contenido del primer archivo procesado.  Por ejemplo, supóngase que quiero recorrer todo el archivo "nota.txt" para cambiar la palabra "la" por "su":


>>> mi_archivo.close()
>>> mi_archivo=open("/home/jlaurentum/Documentos/nota.txt","r")
>>> otro_archivo=open("/home/jlaurentum/Documentos/nota2.txt","w")
>>> for linea in mi_archivo:
...     linea=linea.replace("la","su")
...     otro_archivo.write(linea)
...
>>> otro_archivo.close()
>>> mi_archivo.close()
>>>



Entonces, buscamos el archivo "nota2.txt" y lo abrimos con el editor de texto, verificando su contenido:


Este es un archivo de prueba.
Esta es su segunda línea.
Y esta es su tercera línea.



Para este ejemplo, tuvimos suerte.  El método replace sustituye todas las ocurrencias de su primer argumento por la cadena suministrada en su segundo argumento.  Si hubiesemos tenido una palabra como "reemplazarla", se hubiese cambiado a "reemplazarsu", lo cual seguramente no hubiesemos querido.  En otra entrada de este blog hablaremos de expresiones regulares, que nos permitirán hacer un procesamiento más avanzado con data de texto.


Exiten otras formas de leer un archivo, por ejemplo, podemos leer el archivo caracter por caracter.  El siguiente script cuenta el número de caracteres de nuestro archivo de ejemplo:


>>> mi_archivo=open("/home/jlaurentum/Documentos/nota.txt","r")
>>> contador=0
>>> caracter=mi_archivo.read(1)
>>> while caracter!="":
...     contador+=1
...     caracter=mi_archivo.read(1)
...
>>> print contador
87
>>> mi_archivo.close()
>>>



Este archivo contiene 87 caracteres, es decir, su tamaño es de 87 bytes.  Observen que esto concuerda con lo que nos reporta la consulta de las propiedades de ese archivo.  Tambien podemos leer el archivo de un sólo trancazo en memoria, como una lista de cadenas:


>>> mi_archivo=open("/home/jlaurentum/Documentos/nota.txt","r")
>>> lineas=mi_archivo.readlines()
>>> print lineas
['Este es un archivo de prueba. \n', 'Esta es la segunda l\xc3\xadnea.\n', 'Y esta es la tercera l\xc3\xadnea.\n']
>>> mi_archivo.close()
>>>



Los elementos raros en esta lista de cadenas se corresponden a caracteres especiales, como la "í" con acento en "línea", cuya codificación  utf-8, en 2 bytes, es c3ad.

Finalmente, hasta las páginas web se pueden leer como archivos de texto.  Por ejemplo, el siguiente script abre la página de la primera entrada de este blog:


from urllib import *
pagina=urlopen("http://mont-epython.blogspot.com/2011/06/como-primera-entrada-de-este-blog.html")
for linea in pagina:
    print linea[:-1]
pagina.close()


No se indicó la salida del interprete python en rojo porque este script imprime muchas líneas.  Observen que el tratamiento de una página web es virtualmente idéntico al de un archivo de texto: lo abrimos, lo leemos y lo cerramos.  La ruta del archivo es simplemente la dirección URL de la página, pero al abrir esta página y leerla, no vemos lo que veriamos en el navegador, vemos otra cosa.  ¿Qué exactamente? ¡Corran el script y averigüenlo!






Referencias