<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Codigo Python</title>
	<atom:link href="http://www.codigopython.com.ar/feed" rel="self" type="application/rss+xml" />
	<link>http://www.codigopython.com.ar</link>
	<description></description>
	<lastBuildDate>Sun, 03 Jun 2012 02:55:50 +0000</lastBuildDate>
	<language>es-ES</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Tkinter en Wikibooks</title>
		<link>http://www.codigopython.com.ar/noticias/tkinter-en-wikibooks</link>
		<comments>http://www.codigopython.com.ar/noticias/tkinter-en-wikibooks#comments</comments>
		<pubDate>Sun, 03 Jun 2012 02:19:06 +0000</pubDate>
		<dc:creator>Administrador</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[entorno grafico]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[Tkinter]]></category>
		<category><![CDATA[Wikibooks]]></category>
		<category><![CDATA[Wikilibros]]></category>

		<guid isPermaLink="false">http://www.codigopython.com.ar/?p=288</guid>
		<description><![CDATA[Luego de la reestructuración de la guía, he tomado la decisión de expandir un poco mas su alcance ofreciéndola en Wikilibros]]></description>
				<content:encoded><![CDATA[<p><img class="alignnone" title="Logo Wikibooks" src="http://upload.wikimedia.org/wikipedia/commons/0/05/Wikibooks-logo-es.png" alt="Logo Wikibooks" width="135" height="135" />Luego de la reestructuración de la guía, he tomado la decisión de expandir un poco mas su alcance ofreciéndola en Wikilibros (<a href="http://es.wikibooks.org/wiki/%EF%BB%BFInterfaz_gr%C3%A1fica_con_Tkinter" title="Interfaz Grafica con Tkinter" target="_blank">http://es.wikibooks.org/wiki/%EF%BB%BFInterfaz_gr%C3%A1fica_con_Tkinter</a>) para que su edición y contenido este al alcance de todos sin restricciones, no por esto dejare el trabajo en el repositorio Git ya que este servirá para contener todos los cambios que realice y los que ustedes realicen. Los cambios que haga y suba a GitHub luego irán a Wikibooks y las mejoras que lleguen desde wikibooks irán al repositorio. Seguro los confundí, pero espero que este cambio llegue a ser una mejora para quitar las limitaciones que ofrece el actual desarrollo que resulta un poco cerrado y eso es una cosa a la no que quiero llegar.</p>
<p>Así que ya saben, siéntanse libres de hacerme llegar sus dudas comentarios o sugerencias que no molestan.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigopython.com.ar/noticias/tkinter-en-wikibooks/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>¿Te gustaria videotutoriales de Tkinter?</title>
		<link>http://www.codigopython.com.ar/noticias/te-gustaria-videotutoriales-de-tkinter</link>
		<comments>http://www.codigopython.com.ar/noticias/te-gustaria-videotutoriales-de-tkinter#comments</comments>
		<pubDate>Thu, 31 May 2012 21:54:00 +0000</pubDate>
		<dc:creator>Administrador</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[encuesta]]></category>
		<category><![CDATA[entorno grafico]]></category>
		<category><![CDATA[Tkinter]]></category>
		<category><![CDATA[videotutorial]]></category>

		<guid isPermaLink="false">http://www.codigopython.com.ar/?p=294</guid>
		<description><![CDATA[Me gustaría que participaran de una encuesta que estoy realizando, creo que seria bueno ir acompañando el desarrollo de la guía con unos vídeos que la acompañen. Pero nunca hice un videotutorial y me gustaría saber que temas deberían ser tocados en el vídeo y de ser posible algunos consejos para la elaboración, cualquier comentario que quieran hacer es bienvenido.]]></description>
				<content:encoded><![CDATA[<p>Me gustaría que participaran de una encuesta que estoy realizando, creo que seria bueno ir acompañando el desarrollo de la guía con unos vídeos que la acompañen. Pero nunca hice un videotutorial y me gustaría saber que temas deberían ser tocados en el vídeo y de ser posible algunos consejos para la elaboración, cualquier comentario que quieran hacer es bienvenido.</p>
Nota: Hay una encuesta incrustada en este post, por favor visite la página para participar en la encuesta de este post.
]]></content:encoded>
			<wfw:commentRss>http://www.codigopython.com.ar/noticias/te-gustaria-videotutoriales-de-tkinter/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Reestructuracion de la guia de Tkinter</title>
		<link>http://www.codigopython.com.ar/noticias/reestructuracion-de-la-guia-de-tkinter</link>
		<comments>http://www.codigopython.com.ar/noticias/reestructuracion-de-la-guia-de-tkinter#comments</comments>
		<pubDate>Wed, 23 May 2012 23:45:36 +0000</pubDate>
		<dc:creator>Administrador</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://www.codigopython.com.ar/?p=284</guid>
		<description><![CDATA[A fin de retomar el desarrollo de la guía de Tkinter, estoy comenzando con una fuerte reestructuración de su contenido para facilitar su lectura y mantenimiento, entre las tareas que ya hice al momento de redactar estas palabras y las que me faltan por hacer están las de separar las secciones y subsecciones en documentos y directorios separados que txt2tags se encarga de unir en el proceso de conversión, también me encuentro agregando nuevas secciones y corrigiendo lo ya estaba escrito y por ultimo se encuentran las imágenes que las sustituiré por otras que mantengan a lo largo de la guía el mismo aspecto.]]></description>
				<content:encoded><![CDATA[<p>A fin de retomar el desarrollo de la guía de Tkinter, estoy comenzando con una fuerte reestructuración de su contenido para facilitar su lectura y mantenimiento, entre las tareas que ya hice al momento de redactar estas palabras y las que me faltan por hacer están las de separar las secciones y subsecciones en documentos y directorios separados que txt2tags se encarga de unir en el proceso de conversión, también me encuentro agregando nuevas secciones y corrigiendo lo ya estaba escrito y por ultimo se encuentran las imágenes que las sustituiré por otras que mantengan a lo largo de la guía el mismo aspecto.</p>
<p>Como palabras finales les recuerdo que pueden seguir el desarrollo desde el repositorio GIT (<a href="https://github.com/eliluminado/Guia-Tkinter" target="_blank">https://github.com/eliluminado/Guia-Tkinter</a>), cualquier corrección que vean que necesita la guía me mandan un correo o lo dejan en el repositorio en GitHub (<a href="https://github.com/eliluminado/Guia-Tkinter/issues" target="_blank">https://github.com/eliluminado/Guia-Tkinter/issues</a>).</p>
<p>Saludos y nos estamos volviendo a ver dentro de poco.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigopython.com.ar/noticias/reestructuracion-de-la-guia-de-tkinter/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Validacion de CUIT en Python</title>
		<link>http://www.codigopython.com.ar/codigo/validacion-de-cuit-en-python</link>
		<comments>http://www.codigopython.com.ar/codigo/validacion-de-cuit-en-python#comments</comments>
		<pubDate>Thu, 23 Feb 2012 03:59:41 +0000</pubDate>
		<dc:creator>Administrador</dc:creator>
				<category><![CDATA[Codigo]]></category>
		<category><![CDATA[codigo]]></category>
		<category><![CDATA[CUIT]]></category>
		<category><![CDATA[esCUITValida]]></category>
		<category><![CDATA[isdigit]]></category>
		<category><![CDATA[replace]]></category>

		<guid isPermaLink="false">http://www.codigopython.com.ar/?p=274</guid>
		<description><![CDATA[Debido a un proyecto personal que estoy encarando me tope con tener validar una CUIT (Clave Única de Identificación Tributaria) y en ese tiempo libre que le dedique a esta cuestión decidí adornar un poco el código y compartirlo con ustedes si es que algún día deben encarar este mismo problema.
El  [...]]]></description>
				<content:encoded><![CDATA[<p>Debido a un proyecto personal que estoy encarando me tope con tener validar una CUIT (Clave Única de Identificación Tributaria) y en ese tiempo libre que le dedique a esta cuestión decidí adornar un poco el código y compartirlo con ustedes si es que algún día deben encarar este mismo problema.</p>
<p><span style="text-decoration: underline;"><strong>El porque del nombre</strong></span>:<br />
El nombre lo tome del nombre de la función implementada en JavaScript en la pagina de la AFIP para verificar la validez de una CUIT y como resulta muy intuitivo y fácil de recordar decidí utilizarlo y espero que esto no genere conflictos los programadores de la AFIP <img src='http://www.codigopython.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Gran parte del código son comentarios y reglas de validación.<br />
<span id="more-274"></span><br />
El código mencionado es este:</p>
<pre class="brush:py">#!/usr/bin/env python
# -*- coding: utf-8 -*-

# &lt;Aplicacion en Python para verificar la valides de la CUIT.&gt;
# Copyright (C) 2012 Alejandro Alvarez &lt;contacto@codigopython.com.ar&gt;
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.

# http://www.codigopython.com.ar &lt;contacto@codigopython.com.ar&gt;

def esCUITValida(cuit):
    """
    Funcion destinada a la validacion de CUIT
    """
    # Convertimos el valor a una cadena
    cuit = str(cuit)
    # Aca removemos guiones, espacios y puntos para poder trabajar
    cuit = cuit.replace("-", "") # Borramos los guiones
    cuit = cuit.replace(" ", "") # Borramos los espacios
    cuit = cuit.replace(".", "") # Borramos los puntos
    # Si no tiene 11 caracteres lo descartamos
    if len(cuit) != 11:
        return False, cuit
    # Solo resta analizar si todos los caracteres son numeros
    if not cuit.isdigit():
        return False, cuit
    # Despues de estas validaciones podemos afirmar
    #   que contamos con 11 numeros
    # Aca comienza la magia
    base = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
    aux = 0
    for i in xrange(10):
        aux += int(cuit[i]) * base[i]
    aux = 11 - (aux % 11)
    if aux == 11:
        aux = 0
    elif aux == 10:
        aux = 9
    if int(cuit[10]) == aux:
        return True, cuit
    else:
        return False, cuit

if __name__ == "__main__":
    while True:
        print "Para salir ingrese 'Salir'"
        cuit = raw_input('Ingrese la CUIT:\t')
        if cuit == 'Salir' or cuit == 'salir':
            break
        demo = esCUITValida(cuit)
        if not demo[0]:
            print demo[1], "No parece ser un CUIT valido, por favor vuelva a ingresarlo"
        else:
            print demo[1], "Es un numero de CUIT valido"
            break</pre>
<p>Pueden encontrar la ultima versión desde el repositorio de la aplicación:<br />
<a href="https://github.com/eliluminado/esCUITValida" title="https://github.com/eliluminado/esCUITValida">https://github.com/eliluminado/esCUITValida</a><br />
Licencia:<br />
Esta aplicación esta licenciada bajo licencia GNU GPL v3</p>
<p>Saludos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigopython.com.ar/codigo/validacion-de-cuit-en-python/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Se anade el widget Entry</title>
		<link>http://www.codigopython.com.ar/noticias/se-anade-el-widget-entry</link>
		<comments>http://www.codigopython.com.ar/noticias/se-anade-el-widget-entry#comments</comments>
		<pubDate>Mon, 16 Jan 2012 04:19:49 +0000</pubDate>
		<dc:creator>Administrador</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[entorno grafico]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[Tkinter]]></category>
		<category><![CDATA[ventanas]]></category>

		<guid isPermaLink="false">http://www.codigopython.com.ar/?p=270</guid>
		<description><![CDATA[Les aviso que el desarrollo de la guía continua en esta oportunidad pueden encontrar sobre el widget Entry, aunque el avance de la guía no va al ritmo que me gustaría que tuviera pero sigo dando batalla y creando nuevo contenido para la misma. Puede que resulte un tanto repetitivo pero cualquier  [...]]]></description>
				<content:encoded><![CDATA[<p>Les aviso que el desarrollo de la guía continua en esta oportunidad pueden encontrar sobre el widget Entry, aunque el avance de la guía no va al ritmo que me gustaría que tuviera pero sigo dando batalla y creando nuevo contenido para la misma. Puede que resulte un tanto repetitivo pero cualquier aporte siempre es bienvenido.</p>
<p>Me despido y nos veremos cuando haya nuevos avances en la guía.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigopython.com.ar/noticias/se-anade-el-widget-entry/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Visualizar la guia de Tkinter</title>
		<link>http://www.codigopython.com.ar/noticias/visualizar-la-guia-de-tkinter</link>
		<comments>http://www.codigopython.com.ar/noticias/visualizar-la-guia-de-tkinter#comments</comments>
		<pubDate>Wed, 28 Dec 2011 03:46:05 +0000</pubDate>
		<dc:creator>Administrador</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[entorno grafico]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[Tkinter]]></category>
		<category><![CDATA[ventanas]]></category>

		<guid isPermaLink="false">http://www.codigopython.com.ar/?p=264</guid>
		<description><![CDATA[Para los que deseen seguir el avance de la guía de una forma mas visual sin tener que bajar los archivos fuentes de la misma pueden hacerlo desde la pagina Guia Tkinter. Desde allí podrán ver la ultima versión generada en HTML de la guía.
]]></description>
				<content:encoded><![CDATA[<p>Para los que deseen seguir el avance de la guía de una forma mas visual sin tener que bajar los archivos fuentes de la misma pueden hacerlo desde la pagina <a href="http://www.codigopython.com.ar/guia-tkinter" title="Guia Tkinter">Guia Tkinter</a>. Desde allí podrán ver la ultima versión generada en HTML de la guía.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigopython.com.ar/noticias/visualizar-la-guia-de-tkinter/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Segui mis avances con la guia de Tkinter</title>
		<link>http://www.codigopython.com.ar/miniguias/segui-mis-avances-con-la-guia-de-tkinter</link>
		<comments>http://www.codigopython.com.ar/miniguias/segui-mis-avances-con-la-guia-de-tkinter#comments</comments>
		<pubDate>Sat, 12 Nov 2011 20:46:10 +0000</pubDate>
		<dc:creator>eliluminado</dc:creator>
				<category><![CDATA[Miniguias]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[entorno grafico]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[repositorio]]></category>
		<category><![CDATA[Tkinter]]></category>
		<category><![CDATA[ventanas]]></category>

		<guid isPermaLink="false">http://www.codigopython.com.ar/?p=228</guid>
		<description><![CDATA[Para todos los que deseen seguir mis avances en la guía de Tkinter les dejo unas pequeñas instrucciones como para que puedan empezar a seguirme en el desarrollo de la guía.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.codigopython.com.ar/wp-content/uploads/2011/11/Logo_GitHub.png"><img class="alignleft size-full wp-image-229" title="Logo GitHub" src="http://www.codigopython.com.ar/wp-content/uploads/2011/11/Logo_GitHub.png" alt="Logo GitHub" width="130" height="130" /></a>Para todos los que deseen seguir mis avances en la guía de Tkinter les dejo unas pequeñas instrucciones como para que puedan empezar a seguirme en el desarrollo de la guía.</p>
<p>La guía como les había comentado en &#8220;<a title="Trabajando en mi primer guía sobre Tkinter" href="http://www.codigopython.com.ar/noticias/trabajando-en-mi-primer-guia-sobre-tkinter">http://www.codigopython.com.ar/?p=214</a>&#8221; va ir siendo almacenada en los servidores de GitHub en sus repositorios Git como si se tratara del desarrollo de una aplicación, en ellos iré subiendo periódicamente los cambios y avances que vaya realizando. Para descargar una copia de la guía y todos los archivos que la complementan así como las imágenes, las podemos obtener haciendo click en el siguiente enlace en donde se generara un archivo .zip donde estarán contenidos los archivos mencionados</p>
<p><a title="Bajar los archivos haciendo click aquí" href="https://github.com/eliluminado/Guia-Tkinter/zipball/master" target="_blank">https://github.com/eliluminado/Guia-Tkinter/zipball/master</a></p>
<p>Otra forma un poco mas compleja pero mas útil es teniendo en nuestra PC instalado Git para así poder crear una copia del repositorio y con unas simples ordenes desde la consola actualizar los archivos a sus ultimas versiones. Para esto deberán tener como mencione instalado Git (Pueden encontrar varias guías de instalación en la web) y desde la consola escribir los siguiente:</p>
<pre>git clone git://github.com/eliluminado/Guia-Tkinter.git DIRECTORIO</pre>
<p>Donde se tiene que reemplazar la palabra &#8216;DIRECTORIO&#8217; por el nombre de la carpeta donde desean crear la copia de los archivos.</p>
<p>Con esto hecho ya obtendrán una copia de los archivos, para actualizarlos deberán escribir en la consola:</p>
<pre>git pull</pre>
<p>Cualquier duda que tengan pueden dejar su comentario aqui y se los respondere.</p>
<p>Saludos y nos estaremos viendo en otro post <img src='http://www.codigopython.com.ar/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigopython.com.ar/miniguias/segui-mis-avances-con-la-guia-de-tkinter/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Trabajando en mi primer guia sobre Tkinter</title>
		<link>http://www.codigopython.com.ar/noticias/trabajando-en-mi-primer-guia-sobre-tkinter</link>
		<comments>http://www.codigopython.com.ar/noticias/trabajando-en-mi-primer-guia-sobre-tkinter#comments</comments>
		<pubDate>Mon, 24 Oct 2011 23:49:46 +0000</pubDate>
		<dc:creator>eliluminado</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[codigo]]></category>
		<category><![CDATA[entorno grafico]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[Tkinter]]></category>
		<category><![CDATA[ventanas]]></category>

		<guid isPermaLink="false">http://www.codigopython.com.ar/?p=214</guid>
		<description><![CDATA[Después de mucho tiempo inactivo sigo aprendiendo sobre Python esta vez le toca el turno a Tkinter, pero en el camino me tope con que no hay mucha información sobre este en español, que mientras en ingles encontramos guiás y tutoriales muy buenos en nuestro idioma no es así. Que mejor para  [...]]]></description>
				<content:encoded><![CDATA[<p>Después de mucho tiempo inactivo sigo aprendiendo sobre Python esta vez le toca el turno a Tkinter, pero en el camino me tope con que no hay mucha información sobre este en español, que mientras en ingles encontramos guiás y tutoriales muy buenos en nuestro idioma no es así. Que mejor para solventar este inconveniente que crear una guiá en español OpenSource, en donde iré compartiendo el &#8216;código fuente&#8217; de la guiá hasta que la termine y la publique tanto en este blog así como en la wiki [<a href="http://wiki.codigopython.com.ar" target="_blank">wiki.codigopython.com.ar</a>].</p>
<p>Todos los que deseen colaborar o hacer sus comentarios pueden ponerse en contacto conmigo dando su comentario en este post o escribiéndome a:</p>
<p>contacto@codigopython.com.ar</p>
<p>Para consultar la guiá pueden hacerlo desde mi repositorio en GitHub y ver como va avanzando, si lo desean también pueden colaborar desde allí con su desarrollo.</p>
<p><a title="Repositorio GIT de mi guia de Tkinter" href="https://github.com/eliluminado/Guia-Tkinter" target="_blank">https://github.com/eliluminado/Guia-Tkinter</a></p>
<p>Para los que desean colaborar van a notar que use varios símbolos y caracteres, esos caracteres sirven para proveer de un formato al texto y gracias a txt2tags luego poder convertir ese texto a a por ejemplo HTML. Los que estén interesados en colaborar pueden pasar por la pagina de txt2tags para buscar mas información sobre el tema</p>
<p><a href="http://txt2tags.org" title="txt2tags" target="_blank">http://txt2tags.org</a></p>
<p>Me despido y los iré manteniendo al tanto de mis avances.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigopython.com.ar/noticias/trabajando-en-mi-primer-guia-sobre-tkinter/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Aceptando parametros desde la linea de comandos</title>
		<link>http://www.codigopython.com.ar/pyhide/aceptando-parametros-desde-la-linea-de-comandos</link>
		<comments>http://www.codigopython.com.ar/pyhide/aceptando-parametros-desde-la-linea-de-comandos#comments</comments>
		<pubDate>Sat, 11 Jun 2011 04:30:17 +0000</pubDate>
		<dc:creator>eliluminado</dc:creator>
				<category><![CDATA[PyHide]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[ocultos]]></category>
		<category><![CDATA[variables]]></category>

		<guid isPermaLink="false">http://www.codigopython.com.ar/?p=203</guid>
		<description><![CDATA[Bienvenidos a la ya 4ª parte de esta serie de tutoriales, les recuerdo que en los tres anteriores tutoriales creamos tres funciones, las cuales nos permitían ocultar y desolcultar archivos además de una tercera que nos permitía obtener el estado en que se encontraba dicho archivo. En esta  [...]]]></description>
				<content:encoded><![CDATA[<p>Bienvenidos a la ya 4ª parte de esta serie de tutoriales, les recuerdo que en los tres anteriores tutoriales creamos tres funciones, las cuales nos permitían ocultar y desolcultar archivos además de una tercera que nos permitía obtener el estado en que se encontraba dicho archivo. En esta oportunidad les mostrare usando a <a href="http://wiki.codigopython.com.ar/pyhide">PyHide</a> (Pueden encontrar mas información sobre este proyecto aquí <a href="http://wiki.codigopython.com.ar/pyhide">http://wiki.codigopython.com.ar/pyhide</a>) como interactuar con el usuario a través de la linea de comandos aceptando el uso de argumentos, un ejemplo de esto es el uso del comando &#8216;<a href="http://manpages.ubuntu.com/manpages/natty/en/man1/cd.1posix.html">cd</a>&#8216; (este comando nos permite cambiar el directorio de trabajo que estamos utilizando) en Linux este acepta un argumento que es el directorio con el que deseamos trabajar, algo similar deberemos de implementar en nuestra aplicación para facilitar su uso pero para esto planteemos cuales serán lo pasos que tendremos que tener en cuenta para conseguirlo</p>
<p>1 &#8211; El usuario ejecuta nuestra aplicación con un argumento<br />
2 &#8211; Se analizan los argumentos ingresados<br />
3 &#8211; Se ejecuta la función &#8216;<em>hide</em>&#8216;, &#8216;<em>show</em>&#8216; o &#8216;<em>check</em>&#8216; según corresponda</p>
<p>Eso es una breve descripción de la meta que nos proponemos a lo largo del tutorial, ahora si empecemos por el principio de esto. El primer inciso que nos planteamos implica que nuestra aplicación soporte el uso de argumentos para funcionar, en un principio nuestras funciones ya toman un argumento que es el archivo que se utilizara pero nuestra aplicación va a necesitar dos argumentos uno para indicar el archivo y el otro para indicar la acción ha realizar, es decir si se llama a &#8216;<em>hide</em>&#8216; o a &#8216;<em>show</em>&#8216;, pero veamoslo con un ejemplo.<span id="more-203"></span></p>
<p>Supongamos que ejecutamos a nuestra aplicación, en este caso llamada PyHide, la ejecutamos con dos argumentos uno es el archivo y el otro la acción, siendo:</p>
<p>-c = Para utilizar a &#8216;check&#8217;<br />
-s = Para utilizar a &#8216;show&#8217;<br />
-h = Para utilizar a &#8216;hide&#8217;<br />
file = El archivo a utilizar</p>
<p>Un ejemplo seria:</p>
<pre class="brush:shell">python pyhide file -c
# Dándole un archivo para analizar quedaría
python pyhide /usr/bin/firefox -c</pre>
<p>Con lo cual estamos ejecutando nuestra aplicación a través de la linea de comandos para ejecutar la función &#8216;<em>check</em>&#8216; sobre el archivo &#8216;<em>/usr/bin/firefox</em>&#8216;, como nos damos cuenta ya dimos un paso viendo los argumentos que usara nuestra aplicación y como se usaran por parte del usuario pero falta empezar con lo mas importante que es empezar a escribir las lineas de código necesarias para que esto que planteamos se haga una realidad y como se imaginaran ya deberemos meternos en una previa de lo que sera la segunda parte.</p>
<p>Empecemos presentado a una función muy útil cortesía del modulo &#8216;<em>sys</em>&#8216; llamada &#8216;<em>argv</em>&#8216;, esta función va a ser el motor que hará funcionar esto. Esta función &#8216;<em>argv</em>&#8216; tiene una forma muy simple de trabajar ya que este se encarga de almacenar los parámetros introducidos desde la linea de comandos en una lista a la que podemos acceder escribiendo &#8220;<em>sys.argv[]</em>&#8221; ingresando desde luego el índice entre los corchetes &#8216;<em>[]</em>&#8216;, una de las cosas que hay que tener en cuenta es el orden en que se almacenan los parámetros. El primer valor que almacena es el nombre del archivo, el segundo es el primer parámetro y el tercero el segundo parámetro, así como se imaginaran para el resto de los parámetros en caso de que existan.</p>
<p>Veamoslo con un ejemplo antes de continuar</p>
<p>Un ejemplo seria<br />
<strong> python pyhide.py file1 file2 file3 action</strong><br />
Donde:<br />
sys.argv[0] = pyhide.py<br />
sys.argv[1] = file1<br />
sys.argv[2] = file2<br />
sys.argv[3] = file3<br />
sys.argv[4] = action</p>
<p>Para ver como funciona lo que les mostré arriba es tan simple como crear un archivo (Con o sin la extensión .py) y dentro de este colocamos algo similar a esto:</p>
<p>&nbsp;</p>
<pre class="brush:py">import sys

for elements in sys.argv:
    print elements</pre>
<p>&nbsp;</p>
<p>Y a este archivo desde nuestra consola (Recuerden de estar trabajando en la misma carpeta donde se encuentra este archivo) lo ejecutaremos de la siguiente forma:</p>
<p><strong>python archivo.py 1 2 3</strong></p>
<p>Y el resultado sera este:</p>
<pre class="brush:shell">$ python archivo.py 1 2 3
archivo.py
1
2
3</pre>
<p>Lo que conseguimos es imprimir todas la variables almacenadas en la lista &#8216;<em>sys.argv&#8217;</em>, ahora puede surgir una duda sobre ese pequeño script que usamos para mostrar los parámetros ingresados desde la consola, que aunque este lejos de ser el motivo del tutorial no esta de mas explicar su funcionamiento de forma breve.</p>
<p>Bueno comienzo a explicar el porque y como del uso del siguiente script:</p>
<p>&nbsp;</p>
<pre class="brush:py">import sys

for elements in sys.argv:
    print elements</pre>
<p>&nbsp;</p>
<p>En la primer linea se importa el modulo &#8216;<em>sys</em>&#8216; que es necesario para poder usar la función de este llamada &#8216;<em>argv</em>&#8216;, ya en la tercera nos encontramos con el bucle &#8216;<a href="http://es.wikipedia.org/wiki/Python#Bucle_for">for</a>&#8216; en esta el cuerpo del bucle se ejecuta tantas veces como elementos tenga la lista en este caso se ejecutaría 4 veces el cuerpo de nuestro bucle, es decir se ejecuta cuatro veces la sentencia &#8216;<em>print</em>&#8216;, mostrando así los cuatro argumentos almacenados en &#8216;<em>sys.argv&#8217;</em>. Para mas información pueden consultar en algún libro o tutorial de Python donde podrán encontrar mas información sobre el bucle &#8216;<em>for</em>&#8216;.</p>
<p>Hasta ahora tenemos una idea de como funciona &#8216;argv&#8217; y como almacenar estos valores en variables para su posterior uso, pero nos esta faltando un paso importante saber si el usuario esta ejecutando nuestra aplicación desde la linea de comandos o lo esta importando desde otra aplicación.</p>
<p>&nbsp;</p>
<p><strong>NOTA</strong>:<br />
La diferencia entre ejecutar una aplicación (o script) o importarlo radica en que al importarlo su forma de uso se asemeja a como usamos los módulos de Python porque lo que hacemos es utilizar funciones contenidas dentro de este y la interacción con el usuario lo hace la aplicación que importa a la nuestra, en cambio cuando el usuario ejecuta nuestra aplicación directamente necesitamos establecer una forma de comunicación e interacción con el usuario para su uso (Aunque esto no es siempre necesario cuando se tratan de scripts). En esta oportunidad trabajaremos con la consola aunque mas adelante lo veremos ya con una interfaz gráfica pero sera material para otro tutorial.</p>
<p>Para identificar si nuestra aplicación esta siendo ejecutada desde la consola tenemos que conocer y entender a el modulo &#8216;<em>__main__</em>&#8216;, esto es porque este nos permitirá dividir la parte que analiza si se esta ejecutando nuestra aplicación directamente de el resto del código que tenemos.</p>
<p>Con &#8216;<em>__main__</em>&#8216; comenzamos ya nuestra segunda parte, no vamos ver muy a fondo tanto a &#8216;<em>sys.argv</em>&#8216; como a &#8216;<em>__main__</em>&#8216; porque mas adelante veremos a estos dos de nuevo pero de una forma mas avanzada en otro tutorial. Cuando se habla de &#8216;<em>__main__</em>&#8216; y &#8216;<em>sys.argv</em>&#8216; se tiende a hablar del siguiente condicional:</p>
<p><strong>if __name__ == &#8220;__main__&#8221;:</strong></p>
<p>Como vemos entran en juego dos factores uno es &#8216;<em>__main__</em>&#8216; y el otro es &#8216;<em>__name__</em>&#8216;, toda la explicación que les pueda dar sobre estos dos se resume a lo siguiente:</p>
<p>Si &#8216;<em>__name__</em>&#8216; toma el valor &#8216;<em>__main__</em>&#8216; nuestra aplicación se esta ejecutando como un programa independiente y no es importada por otra, en cambio si nuestra aplicación es importada &#8216;<em>__name__</em>&#8216; tomara el nombre del archivo (Sin su extensión) o mejor dicho el nombre del modulo.</p>
<p><strong>RECUERDEN</strong>:<br />
Recordemos que los módulos cuando se importan no llevan la extensión &#8216;<em>.py</em>&#8216; solo el nombre del archivo.</p>
<p>Por ejemplo si abrimos la consola de Python y escribimos &#8220;<em>__name__</em>&#8221; nos responderá lo siguiente:</p>
<pre class="brush:shell">&gt;&gt;&gt; __name__
'__main__'
&gt;&gt;&gt;</pre>
<p>Esto es porque estamos ejecutando directamente desde la consola, pero para saber si esto no se repite cuando uno importa nuestra aplicación (o script dependerá de con que trabajemos) no nos quedara mas que demostrarlo, acá la cosa se complica por que deberemos crear dos archivos uno que importe un archivo y otro que sea importado. En este caso voy a crear dos archivos uno que se llame &#8216;<em>linux.py</em>&#8216; que va a ser el archivo que importe el modulo y el otro sera &#8216;<em>rule.py</em>&#8216;</p>
<p>Dentro de linux.py pondremos lo básico que sera importar el archivo &#8216;rule.py&#8217;</p>
<p>linux.py</p>
<pre class="brush:py">import rule</pre>
<p>&nbsp;</p>
<p>Dentro de rule.py imprimiremos la salida de &#8216;<em>__name__</em>&#8216; para ver que resultado nos arroja.</p>
<p>rule.py</p>
<pre class="brush:py">print __name__</pre>
<p>Una vez creados los dos archivos y ubicados en la misma carpeta (Esto ultimo es muy importante para que funcione) ejecutaremos el archivo &#8216;<em>linux.py</em>&#8216; en nuestra consola:</p>
<pre class="brush:shell">$ python linux.py
rule</pre>
<p>Como observamos la salida es lo que habíamos anticipado el nombre del archivo, pero como se que son desconfiados quizás se pregunten si ejecutamos directamente el archivo &#8216;<em>rule.py</em>&#8216; se nos da que  &#8216;<em>__name__</em>&#8216; es igual a &#8216;<em>__main__</em>&#8216;, hacerlo es tan simple como escribir en la consola &#8216;<em>rule.py</em>&#8216; (Recuerden estar ubicados en la misma directorio donde se encuentran ubicados los dos archivos)</p>
<p>La salida sera la siguiente:</p>
<pre class="brush:shell">$ python rule.py
__main__</pre>
<p>Con lo que corroboramos de que nos les había mentido <img src='http://www.codigopython.com.ar/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Ya vimos a &#8216;<em>sys.argv</em>&#8216; y a &#8216;<em>__main__</em>&#8216; es hora de unirlos y ponerlos a prueba en PyHide, así que lo mejor sera poner lo que ya tenemos hasta ahora:</p>
<p>&nbsp;</p>
<pre class="brush:py">import os

def hide(file):
    if not os.path.exists(file):
        return
    archive = os.path.basename(file)
    directorio = os.path.dirname(file)
    if archive[0] == '.':
        return
    else:
        newfile = directorio+'/''.'+archive
        os.rename(file, newfile)

def show(file):
    if not os.path.exists(file):
        return
    archive = os.path.basename(file)
    directorio = os.path.dirname(file)
    if archive[0] != '.':
        return
    else:
        while archive[0] is '.':
            archive = archive[1:]
        newfile = directorio+'/'+archive
        os.rename(file, newfile)

def check(file):
    if not os.path.exists(file):
        return "El archivo no existe"
    archive = os.path.basename(file)
    if archive[0] == '.':
        return archive + " Se encuentra oculto"
    else:
        return archive + " No se encuentra oculto"</pre>
<p>&nbsp;</p>
<p>Para dotarlo de la capacidad de poder utilizar argumentos desde la linea de comando deberemos agregar un par de lineas, una de estas sera obviamente donde importemos al modulo &#8216;<em>sys</em>&#8216; las otras serán las que analicen los argumentos ingresados. Cuando llegamos a este punto debemos considerar que el usuario no ingrese parámetros o que no ingrese comandos validos, por esto mismo debemos cubrir esas posibilidades planteando los posibles problemas y soluciones.</p>
<p>Empecemos con una pequeña lista como esta:</p>
<p>El usuario no ingresa argumentos<br />
El usuario no ingresa la cantidad necesaria de argumentos<br />
Los argumentos ingresados no son validos</p>
<p>Empecemos desde el principio, sabemos que la cantidad mínima de valores que contiene la lista generada por &#8216;<em>sys.argv</em>&#8216; es de 1 valor el cual es el nombre del archivo, así que la longitud de &#8216;<em>argv</em>&#8216; debe mayor a uno, pero si vemos el siguiente punto de nuestra lista tenemos que tener cuenta que nuestra aplicación requiere de dos argumentos como mínimo y máximo los cuales eran el nombre del archivo y la acción a realizar, de esta forma al replantearlo vemos que la cantidad de valores que tiene que tener &#8216;<em>sys.argv</em>&#8216; debe ser igual a tres. Para analizar la longitud de &#8216;<em>sys.argv</em>&#8216; tenemos que considerar el uso de &#8216;<em>len()&#8217;</em>, así como se suele utilizar para analizar cadenas de texto se puede utilizar para analizar listas y tuplas entre otros. En nuestro caso tenemos que crear un condicional que analice esta condición de la siguiente forma:</p>
<pre class="brush:py">if len(sys.argv) != 3:
    return
else:
    pass</pre>
<p>Quedemos con eso por un momento antes de seguir, primero analizamos si la cantidad de argumentos es la correcta en caso de no serlo como vemos terminamos la ejecución del mismo, si la cantidad de argumentos es la indicada continuamos con el condicional ejecutando lo que coloquemos debajo del &#8216;<em>else</em>&#8216; en el caso de que lo necesitamos, en nuestro caso prescindiremos de su uso, una vez superado esto comencemos a analizar el tercer valor que tomara &#8216;<em>sys.argv</em>&#8216; que sera la acción a realizar por nuestra aplicación. Recordemos los tres valores que podía tomar</p>
<p>-c = Para utilizar a &#8216;check&#8217;<br />
-s = Para utilizar a &#8216;show&#8217;<br />
-h = Para utilizar a &#8216;hide&#8217;</p>
<p>Como observamos dependerá del argumento ingresado para determinar que función se deberá de llamar, lo primero que podemos hacer es tomar los dos valores que nos interesan y asignarlos a dos variables para facilitar su uso.</p>
<p><strong>file = sys.argv[1]</strong><br />
<strong> action = sys.argv[2]</strong></p>
<p>El valor de &#8216;file&#8217; no lo analizaremos eso lo hará la función que sea llamada luego, lo que si tenemos que analizar es el valor de &#8216;action&#8217; y dependiendo de el valor que tome actuar en consecuencia, para esto con unos condicionales nos bastara para que quede de la siguiente forma:</p>
<pre class="brush:py">if action == '-c':
    check(file)
elif action == '-h':
    hide(file)
elif action == '-s':
    show(file)
else:
    return</pre>
<p>Como observamos de una forma mas que simple analizamos las cuatro posibilidades que se nos puede presentar, la ultima de estas que esta comprendida por el condicional &#8216;else&#8217; esta para actuar en caso de que el usuario haya ingresado un valor incorrecto.</p>
<p><strong>NOTA</strong>:<br />
En los casos que use la sentencia return se pueden reemplazar por mensajes de error indicándole al usuario que fue lo que sucedió pero eso sera material para otro tutorial.</p>
<p>Hasta ahora tenemos partes que satisfacen nuestras necesidades pero nos queda juntar todo esto dentro del condicional</p>
<p><strong>if __name__ == &#8216;__main__&#8217;:</strong></p>
<p>Para que solo se ejecute cuando el usuario este ejecutando nuestra aplicación desde la consola, así que es cuestión de juntar las partes para formar un todo.</p>
<pre class="brush:py">if __name__ == '__main__':
    if len(sys.argv) != 3:
        print "La cantidad de argumentos ingresada no es correcta"
	file = sys.argv[1]
	action = sys.argv[2]
    if action == '-c':
        print check(file)
    elif action == '-h':
        hide(file)
        print "El archivo se encuentra oculto"
    elif action == '-s':
        show(file)
        print "El archivo ya no se encuentra oculto"
    else:
        print "El argumento ingresado no es correcto"</pre>
<p>&nbsp;</p>
<p>Aunque funciona es una forma un tanto desprolija e incompleta de conseguir esto pero por ahora nos alcanza para dotar a nuestra aplicación de soporte para poder utilizarla desde la linea de comandos. Para probar lo que hicimos hasta ahora es tan simple como juntar todo esto en un archivo al que en mi caso llamare &#8216;PyHide.py&#8217; y lo ejecutare con los siguientes valores:</p>
<p><strong>python PyHide.py /usr/bin/firefox -c</strong></p>
<p>Y deberíamos obtener algo similar a esto:</p>
<pre class="brush:shell">$ python PyHide.py /usr/bin/firefox -c
firefox No se encuentra oculto</pre>
<p>&nbsp;</p>
<p>Cerrando el tutorial de hoy les dejo el contenido del archivo PyHide.py con su respectiva licencia</p>
<p>&nbsp;</p>
<pre class="brush:py">#!/usr/bin/env python
# -*- coding: utf-8 -*-

# &lt;Aplicación para ocultar archivos en sistemas Unix.&gt;
# Copyright (C) 2011 Alejandro Alvarez &lt;contacto@codigopython.com.ar&gt;
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.

# http://www.codigopython.com.ar &lt;contacto@codigopython.com.ar&gt;

import os, sys

def hide(file):
    if not os.path.exists(file):
        return
    archive = os.path.basename(file)
    directorio = os.path.dirname(file)
    if archive[0] == '.':
        return
    else:
        newfile = directorio+'/''.'+archive
        os.rename(file, newfile)

def show(file):
    if not os.path.exists(file):
        return
    archive = os.path.basename(file)
    directorio = os.path.dirname(file)
    if archive[0] != '.':
        return
    else:
        while archive[0] == '.':
            archive = archive[1:]
        newfile = directorio+'/'+archive
        os.rename(file, newfile)

def check(file):
    if not os.path.exists(file):
        return "El archivo no existe"
    archive = os.path.basename(file)
    if archive[0] == '.':
        return archive + " Se encuentra oculto"
    else:
        return archive + " No se encuentra oculto"

if __name__ == '__main__':
    if len(sys.argv) != 3:
        print "La cantidad de argumentos ingresada no es correcta"
	file = sys.argv[1]
	action = sys.argv[2]
    if action == '-c':
        print check(file)
    elif action == '-h':
        hide(file)
        print "El archivo se encuentra oculto"
    elif action == '-s':
        show(file)
        print "El archivo ya no se encuentra oculto"
    else:
        print "El argumento ingresado no es correcto"</pre>
<p>&nbsp;</p>
<p><strong>NOTA</strong>:<br />
El condicional &#8220;<em>if __name__ ==&#8217;__main__&#8217;:</em>&#8221; deberá ir debajo de las funciones/variable que desee o necesite llamar, esto es así porque no podemos ejecutar una función o leer una variable que el interprete aun no ejecuto.</p>
<p>Como conclusión y para cerrar este tutorial podemos decir que junto a &#8216;<em>sys.argv</em>&#8216; y el uso de &#8220;<em>if __name__ == &#8220;__main__&#8221;</em>&#8221; se puede trabajar como módulos reutilizables o como programas independientes sin tener que crear dos archivos con lo cual estamos ampliando las posibilidades del uso y mantenimiento de nuestra aplicación.</p>
<p>&nbsp;</p>
<p><strong>Glosario</strong>:<br />
!= : Distinto de</p>
<p><strong>Unos links que les pueden ser útiles</strong><br />
<em> Acerca de PyHide:</em><br />
<a href="http://wiki.codigopython.com.ar/pyhide"> http://wiki.codigopython.com.ar/pyhide</a><br />
<em> __main__:</em><br />
<a href="http://docs.python.org/library/__main__.html"> http://docs.python.org/library/__main__.html</a><br />
<em> sys.argv:</em><br />
<a href="http://docs.python.org/library/sys.html#sys.argv"> http://docs.python.org/library/sys.html#sys.argv</a><br />
<em> Bucle &#8216;for&#8217;:</em><br />
<a href="http://es.wikipedia.org/wiki/Python#Bucle_for"> http://es.wikipedia.org/wiki/Python#Bucle_for</a><br />
<a href="http://www.mclibre.org/consultar/python/lecciones/le05_for.html"> http://www.mclibre.org/consultar/python/lecciones/le05_for.html</a><br />
<em> Acerca del comando &#8216;cd&#8217;:</em><br />
<a href="http://manpages.ubuntu.com/manpages/natty/en/man1/cd.1posix.html"> http://manpages.ubuntu.com/manpages/natty/en/man1/cd.1posix.html</a></p>
<p><strong>Material de lectura recomendada:</strong><br />
<a href="http://www.holamundo.es/lenguaje/python/articulos/acceder-argumentos-pasados-parámetro-python.html"> http://www.holamundo.es/lenguaje/python/articulos/acceder-argumentos-pasados-parámetro-python.html</a><br />
<a href="http://mundogeek.net/archivos/2008/04/02/python-entrada-salida-ficheros/"> http://mundogeek.net/archivos/2008/04/02/python-entrada-salida-ficheros/</a><br />
<a href="http://foro.elhacker.net/scripting/python_que_es_name_main-t264304.0.html#ixzz1KOZgDEYm"> http://foro.elhacker.net/scripting/python_que_es_name_main-t264304.0.html#ixzz1KOZgDEYm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigopython.com.ar/pyhide/aceptando-parametros-desde-la-linea-de-comandos/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Analizando el estado de los archivos</title>
		<link>http://www.codigopython.com.ar/tutoriales/analizando-el-estado-de-los-archivos</link>
		<comments>http://www.codigopython.com.ar/tutoriales/analizando-el-estado-de-los-archivos#comments</comments>
		<pubDate>Tue, 03 May 2011 23:51:08 +0000</pubDate>
		<dc:creator>eliluminado</dc:creator>
				<category><![CDATA[PyHide]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[check]]></category>
		<category><![CDATA[codigo]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[IDLE]]></category>
		<category><![CDATA[NINJA-IDE]]></category>

		<guid isPermaLink="false">http://www.codigopython.com.ar/?p=194</guid>
		<description><![CDATA[En las primeras dos partes de esta serie de tutoriales estuvimos viendo como ocultar archivos y como revertir esto utilizando dos funciones una era &#8216;hide&#8216; y la otra &#8216;show&#8216;, con estas dos podemos hacer lo que necesitamos pero quizás nos guste poder obtener el estado en que se encuentre un archivo  [...]]]></description>
				<content:encoded><![CDATA[<p>En las primeras dos partes de esta serie de tutoriales estuvimos viendo como ocultar archivos y como revertir esto utilizando dos funciones una era &#8216;<em>hide</em>&#8216; y la otra &#8216;<em>show</em>&#8216;, con estas dos podemos hacer lo que necesitamos pero quizás nos guste poder obtener el estado en que se encuentre un archivo para por ejemplo poder utilizarlo dentro de nuestra aplicación para informarle al usuario el estado del archivo sin realizar ninguna acción sobre el mismo, para esto crearemos a &#8216;<em>check</em>&#8216; una función que se encargara de esto. La creación de &#8216;<em>check</em>&#8216; sera algo que no nos llevara mucho tiempo ni esfuerzo porque su construcción se basa en lo que ya vimos, hasta ahora tenemos dos funciones como estas:</p>
<pre class="brush:py">def hide(file):
    import os
    if not os.path.exists(file):
        return
    archive = os.path.basename(file)
    directorio = os.path.dirname(file)
    if archive[0] == '.':
        return
    else:
        newfile = directorio+'/''.'+archive
        os.rename(file, newfile)

def show(file):
    import os
    if not os.path.exists(file):
        return
    archive = os.path.basename(file)
    directorio = os.path.dirname(file)
    if archive[0] != '.':
        return
    else:
        while archive[0] is '.':
            archive = archive[1:]
        newfile = directorio+'/'+archive
        os.rename(file, newfile)</pre>
<p>Antes de comenzar a escribir nuestra función debemos plantear que es lo que deseamos conseguir y como lo venimos haciendo pasemos a enumerar las cosas que haremos para conseguir desarrollar esta pequeña pero útil función.</p>
<p>1 &#8211; Entra como parámetro un archivo<br />
2 &#8211; Se verifica si el archivo se encuentra oculto<span id="more-194"></span></p>
<p>La primera parte se vuelve a repetir quedándonos de la misma forma pero ahora estará contenido dentro de &#8216;<em>check</em>&#8216;</p>
<pre class="brush:py">def check(file):
    import os
    if not os.path.exists(file):
        return</pre>
<p>Ahora debemos ver si el archivo se encuentra o no oculto para retornar el mensaje que corresponda, para esto como ya habíamos visto debemos obtener el nombre del archivo de la siguiente forma:</p>
<pre class="brush:py">archive = os.path.basename(file)</pre>
<p>Y analizar si se encuentra oculto el archivo tal cual lo hicimos en &#8216;<em>hide</em>&#8216;:</p>
<pre class="brush:py">if archive[0] == '.':</pre>
<p>Esta vez si retornaremos un mensaje para luego verificar su funcionamiento, el mensaje que retornara sera el siguiente &#8220;<em>Se encuentra oculto</em>&#8221; junto con el nombre del archivo que se analizo en este caso usando la variable &#8216;<em>archive</em>&#8216;, todo esto nos quedaría de la siguiente forma:</p>
<pre class="brush:py">if archive[0] == '.':
    return archive + " Se encuentra oculto"</pre>
<p>Si la condición que analiza ese &#8216;<em>if</em>&#8216; no se cumple es porque el archivo no se encuentra oculto, para manejar esta segunda condición nos alcanza usando a &#8216;<em>else</em>&#8216; de la siguiente forma:</p>
<pre class="brush:py">if archive[0] == '.':
    return archive + " Se encuentra oculto"
else:
    return archive + " No se encuentra oculto"</pre>
<p>Ahora estamos en condiciones de probarlo, para esta tarea podemos usar tanto <a href="http://ninja-ide.org/">Ninja-IDE</a> como a<a href="http://docs.python.org/library/idle.html"> IDLE</a>, como seguramente ustedes ya tienen instalado a IDLE en su sistema lo usare para este ejemplo.</p>
<p>Primero lo mas básico de todo abrimos IDLE, una vez abierto vamos a &#8220;<em>File</em>&#8221; que se encuentra en la barra de menú superior y en el hacemos click en &#8220;<em>Open&#8230;</em>&#8221; y buscamos y abrimos el archivo donde tengamos nuestra función &#8220;<em>check</em>&#8220;, en caso de que no lo tuviésemos contenido dentro de un archivo lo podemos crear haciendo click en &#8220;<em>New Window</em>&#8221; en el menú &#8220;<em>File</em>&#8221; y este nos abrirá el editor donde podremos empezar a escribir nuestra función &#8220;<em>check</em>&#8220;. Una vez abierto o creado el archivo estaremos dentro del editor de IDLE, cabe destacar que siempre tendremos dos ventanas abiertas una con el editor o otra con la shell de Python, ahora que estamos en el editor necesitamos ejecutar nuestra aplicación para esto es tan simple con ir al menú &#8220;<em>Run</em>&#8221; y hacer click en &#8220;<em>Run Module</em>&#8221; o simplemente usando el atajo que nos facilita este editor apretando la tecla F5 de nuestro teclado conseguiremos ejecutar nuestra aplicación o guion dentro de la shell que les habia mencionado. Ahora dentro de la shell podremos ejecutar la función &#8216;<em>check</em>&#8216; simplemente escribiendo lo siguiente:</p>
<p><em>check()</em></p>
<p>Y su salida sera la siguiente:</p>
<pre class="brush:py">&gt;&gt;&gt; check()

Traceback (most recent call last):
  File "&lt;pyshell#0&gt;", line 1, in &lt;module&gt;
    check()
TypeError: check() takes exactly 1 argument (0 given)
&gt;&gt;&gt;</pre>
<p>Ese mensaje de error al ejecutar la función nos indica que la función requiere de un argumento para poder funcionar que es nada menos que el archivo que deseamos analizar, para este ejemplo podemos crear dos archivos ubicados en la misma carpeta, una que este oculto y el otro no debe estarlo, en mi caso quedaría algo así:</p>
<p><em>/home/alejandro/.codigopython</em><br />
<em>/home/alejandro/codigopython</em></p>
<p>Dentro de la shell podemos asignar a estos dos archivos a dos variables para poder utilizarlas en la función &#8216;<em>check</em>&#8216; o podemos también usarlos sin tener que asignarlos a dos variables, empecemos con el primer archivo &#8216;<em>.codigopython</em>&#8216; este se encuentra oculto y nuestra función debería distinguirlo pero para saberlo ejecutemos a &#8216;<em>check</em>&#8216; con &#8216;<em>/home/alejandro/.codigopython</em>&#8216; como argumento:</p>
<pre class="brush:py">&gt;&gt;&gt; check("/home/alejandro/.codigopython")
'.codigopython Se encuentra oculto'
&gt;&gt;&gt;</pre>
<p>Como vemos paso la primer prueba ahora solo nos resta ver si identifica de forma correcta cuando el archivo no se encuentra oculto, para esto hacemos lo mismo que antes pero con el otro archivo</p>
<pre class="brush:py">&gt;&gt;&gt; check("/home/alejandro/codigopython")
'codigopython No se encuentra oculto'
&gt;&gt;&gt;</pre>
<p>Paso las dos pruebas que nos habíamos propuesto desde un principio y ademas podemos intentar para un archivo inexistente como argumento para corroborar que retorne el mensaje que le indicamos</p>
<pre class="brush:py">&gt;&gt;&gt; check(/home/alejandro/codigo_python)
'El archivo no existe'
&gt;&gt;&gt;</pre>
<p>Hoy hemos conseguido no solo crear a &#8216;<em>check</em>&#8216; sino que ademas la hemos probado en IDLE y con esto doy por finalizado el tutorial numero tres.</p>
<p><span style="text-decoration: underline;"><strong>Unos links que pueden ser útiles</strong></span></p>
<p><strong>IDLE</strong>:<br />
<a href="http://docs.python.org/library/idle.html">http://docs.python.org/library/idle.html</a></p>
<p><strong>Ninja-IDE</strong>:<br />
<a href="http://ninja-ide.org/">http://ninja-ide.org/</a></p>
<p><strong>Seguí este post también en</strong></p>
<p><a href="http://snipplr.com/view/52914/">Snipplr.com</a></p>
<p>Taringa</p>
<p>Si ves que este post merece alguna modificación sentite libre de hacerlo a través de nuestra Wiki siguiendo el siguiente enlace:</p>
<p><a href="http://wiki.codigopython.com.ar/pyhide:analizando-el-estado-de-los-archivos">http://wiki.codigopython.com.ar/pyhide:analizando-el-estado-de-los-archivos</a></p>
<p><span style="text-decoration: underline;"><strong>Nota</strong></span>:<br />
Hago una aclaración para los que siguen esta serie de tutoriales, quizás se pregunten porque en todas las funciones llamo al modulo &#8216;<em>os</em>&#8216;, esto es porque no tomo a las funciones como si estuvieran contenidas dentro del mismo script, pero es una practica que solo uso para mostrar la construcción de las funciones.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigopython.com.ar/tutoriales/analizando-el-estado-de-los-archivos/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
