Listas, tuplas, diccionarios y estructuras de control
ACTUALIZADO: Sobre error en la llamada a self.leer_plantilla()
Sobre error en la llamada a self.leer_plantilla()
txt = self.leer_plantilla(self.txt) html = self.leer_plantilla(self.html)
¡Muy buenas Pythoneros! estamos aquí con la tercera entrega de Aprender Python Programando.
El desafío de hoy, no es apto para personas impresionables, pues ¡Bienvenid@s a un nuevo reto para corajud@s!
¿Qué haremos? Hoy agregaremos más funcionalidad a nuestro módulo Presupuesto.
- Diseñaremos una plantilla HTML y otra plantilla TXT para nuestro presupuesto, así, no solo se verá más agradable, sino que además, será más fácil modificarlo
- Comenzaremos a colocar una numeración incremental automática, a cada nuevo presupuesto que generemos
- Podremos elegir entre guardar el archivo en formato HTML o mostrarlo en pantalla
- Crearemos una lista de precios ¡Basta de agregar tantos datos manualmente!
Finalmente, nuestro programa se verá así:
Produciendo presupuestos en formato HTML, como el siguiente:
¿Cómo funcionará ahora?
Ahora, solo nos pedirá:
- Los datos de la empresa y la fecha del presupuesto (igual que antes)
- En vez de detallar el servicio y el importe, los obtendrá de una lista de precios, por lo cual, solo nos pedirá ingresar el código correspondiente al plan:
0: Plan corporativo
1: Plan personal
2: Plan de mantenimiento - Calculará automáticamente el número de presupuesto, y
- Finalmente nos preguntará si deseamos guardar el archivo:
- Si elegimos “S” (si), guardará un HTML y nos informará el nombre del archivo (que será el número de presupuesto con extensión .html)
- Si elegimos “N” (no), nos mostrará el presupuesto en pantalla como lo hacía hasta ahora
- Si nos equivocamos, y no elegimos ni “S” (si) ni “N” (no), nos avisará que ingresamos una opción incorrecta, y nos dará la oportunidad, de volver a elegir.
¡Comencemos!
Archivos necesarios
Para hacerte de los archivos necesarios, sigue los ítemes de esta lista, paso por paso:
- Crea una carpeta llamada capitulo3
Aquí almacenaremos todos los archivos del programa - Dentro de la carpeta “capitulo3”, crea una subcarpeta llamada presupuestos
Aquí se guardarán todos los presupuestos generamos en formato HTML (los que decidamos guardar) - Dentro de la carpeta “capitulo3”, crea otra subcarpeta llamada templates
Aquí guardaremos la plantilla HTML y otra con formato solo texto (TXT) - Dentro de la carpeta templates guarda los archivos template.html y template.txt
Pulsa en cada archivo para descargarlos desde Launchpad. Estas serán, nuestras dos plantillas - Dentro de la carpeta capitulo3, crea un archivo llamado contador.txt
Será la guía que utilizaremos para calcular incrementalmente nuestros números de presupuesto. - Abre el archivo contador.txt, edita el contenido (está vacío), escribe 100 y guarda los cambios
Inicializamos el contador en 100. Nuestro primer presupuesto, obtendrá el número 101 y así sucesivamente de forma incremental. - Dentro de la carpeta capitulo3, guarda el módulo presupuesto.py (modificado)
Explicaremos todos los cambios nuestro módulo, a lo largo del capítulo.
Finalmente, la estructura de archivos y directorios, deberá verse así:
[-]capitulo3 |_ [+]presupuestos |_ [-]templates |_ template.html |_ template.txt |_ contador.txt |_ presupuesto.py
La lista de precios: Listas, tuplas y diccionarios
Te voy a pedir que abras el módulo Presupuesto (presupuesto.py) y vayas a la línea 22:
# Planes y servicios - Capítulo 3 planes = ('corporativo', 'personal', 'mantenimiento') # Tupla corporativo = ['Diseño Sitio Web corporativo', 7200] # Lista personal = ['Diseño Sitio Web básico', 4500] # Lista mantenimiento = ['Mantenimiento sitio Web (mensual)', 500] # Lista lista_precios = {'corporativo':corporativo, 'personal':personal, 'mantenimiento':mantenimiento} # Diccionario
Como verás, hemos agregado cuatro nuevas propiedades de clase a nuestro módulo. Pero, el tipo de datos, no es ninguno de los que ya hemos visto! Pertenecen a tres nuevos tipos de datos: tuplas, listas y diccionarios.
Tanto las tuplas, como listas y diccionarios, son una forma de almacenar varios datos diferentes, de diversos tipos (cadenas de texto, enteros, flotantes, booleanos…) en una misma variable.
El orden en el cual estos datos se especifican dentro de la variable, se denomina índice, teniendo el primer dato un índice 0 (cero), el siguiente 1, y así incrementalmente.
Veamos estos tres nuevos tipos de datos en detalle:
Tuplas
planes = ('corporativo', 'personal', 'mantenimiento')
- El contenido de una tupla se escribe siempre entre paréntesis ( )
- Admite cualquier tipo de dato:
mi_tupla = (‘texto’, 100, 7.25, False, True)
- Para acceder a uno de esos datos, se realiza por su número de índice: texto es índice 0; 100 es índice 1; 7.25 es índice 2; False es índice 3 y,True es índice 4
- Para acceder a una variable por su número de índice, éste se escribe entre corchetes:
print mi_tupla[2]
imprimirá 7.25 mientras que print mi_tupla[4] imprimirá True
- Los datos contenidos en una tupla no pueden modificarse.
En nuestro código, la tupla planes lo que está haciendo es almacenar el nombre de los tres tipos de planes que ofreceremos a nuestros clientes.
Listas
corporativo = ['Diseño Sitio Web corporativo', 7200] personal = ['Diseño Sitio Web básico', 4500] mantenimiento = ['Mantenimiento sitio Web (mensual)', 500]
- El contenido de una lista se escribe siempre entre corchetes [ ]
- Admite cualquier tipo de dato:
mi_lista = [‘texto’, 100, 7.25, False, True]
- Para acceder a uno de esos datos, se realiza por su número de índice al igual que con las tuplas:
print mi_lista[2]
imprimirá 7.25 mientras que print mi_lista[4] imprimirá True
- A diferencia de las tuplas, los datos contenidos en una lista PUEDEN modificarse, accediendo a ellos por su número de índice:
mi_lista[0] = 'otro contenido'
En nuestro código, hemos creado una lista para cada tipo de plan, donde el índice 0 (cero) será la descripción del servicio y el índice 1, el precio de ese servicio.
Diccionarios
lista_precios = {'corporativo':corporativo, 'personal':personal, 'mantenimiento':mantenimiento}
- El contenido de un diccionario se escribe siempre entre llaves { }
- Admite cualquier tipo de dato
- Cada dato almacenado en un diccionario, debe llevar un nombre de clave antecediendo al dato:
diccionario = {'nombre_de_clave':'texto', 'numero_entero':100, 'numero_flotante':7.25, 'falso':False, 'verdadero':True}
- Para acceder a uno de esos datos, se realiza por su nombre de clave:
print diccionario['numero_entero']
imprimirá 100 y si deseo modificar 100 por 125, escribo: diccionario[‘numero_entero’] = 125. Es decir que al igual que las listas, se pueden modificar los datos.
En nuestro código, hemos creado un diccionario para englobar el nombre de nuestros planes (que actuará como nombre de clave) y el valor de cada clave, será cada una de nuestras listas.
Para saber
Las tuplas, listas y diccionarios, admiten también como valores, otras tuplas, listas y/o diccionarios!
tupla1 = ('rosa', 'verde', 'rojo') tupla2 = (tupla1, 'celeste') tupla3 = ('hortensia', 'neomarica', 'rosa', 'jazmin') lista1 = [tupla1, tupla2, 'negro', 'amarillo'] lista2 = [lista1, 'naranja'] diccionario1 = {'colores':lista2, 'plantas':tupla3} gran_tupla = (diccionario1, 'y algo más!')
Hasta aquí vemos como acceder uno a uno a los datos de una tupla, lista o diccionario. Pero ¿qué sucede si queremos recorrerlos todos y no sabemos cuantos índices tiene? Para ello, utilizaremos una estructura de control llamada bucle for.
Una estructura de control es un bloque de código que permite tomar decisiones de manera dinámica, sobre código existente.
El bucle for
En nuestro código, la estructura de control que estamos implementado se denomina bucle for y es la que se encuentra representada por el siguiente bloque de código (líneas 44, 45 y 46):
for plan in self.planes: texto_a_mostrar += '(%d)%s ' % (codigo_plan, plan) codigo_plan = codigo_plan+1
¿Por qué bucle? Porque es una acción que no se ejecuta solo una vez, sino que lo hará hasta que una condición deje de cumplirse.
¿Qué condición? la que restringe la ejecución de ese bucle. En nuestro caso, la condición estará delimitada por la cantidad de planes en nuestra tupla planes: for plan in self.planes:
Lo anterior puede leerse así:
[for] por
[plan] cada plan
[in] en self.planes
[:] hacer lo que sigue
Es decir que el condicionamiento (limitación) está dado por la cantidad de planes contenidos en la propiedad de clase, planes.
Luego, en cada iteración (es decir, cada repetición dentro del bucle) voy agregando texto a la variable texto_a_mostrar
utilizando una cadena con comodines ¿los recuerdas? Utilizo el patrón d que indica que allí irá un dígito y el patrón s indicando que lo reemplazaré por una string, tal cual lo vimos en capítulos anteriores:
texto_a_mostrar += '(%d)%s ' % (codigo_plan, plan)
Ese texto_a_mostrar es el que se utiliza luego en el raw_input() para preguntar qué tipo de plan ofrecer.
Pero el código de plan lo genero dinámicamente ¿Cómo? Antes del bucle for, inicializo la variable codigo_plan
en cero:
codigo_plan = 0
En el bucle for, la voy incrementando en 1, con cada iteración:
codigo_plan = codigo_plan+1
¿Qué obtengo? El índice de cada plan dentro de la tupla:
Índice 0: corporativo
Índice 1: personal
Índice 2: mantenimiento
Y ¿de dónde surge la variable plan? se declara automáticamente en el bucle for:
for plan in self.planes:
Convirtiendo a enteros con int()
Siguiendo con el método anterior, destinado a la selección de planes, pido ingresar el código correspondiente al plan, que a la vez será el número de índice del plan, dentro de la tupla planes:
elegir_plan = raw_input(texto_a_mostrar)
raw_input() retorna el valor ingresado, como cadena de texto. Pero necesito utilizarlo como número de índice! entonces, convierto ese valor a entero, con otra función nativa de Python: int()
elegir_plan = int(elegir_plan)
Accediendo a datos por su número de índice
Cuando ingresamos el código de plan (0, 1 ó 2) estamos ingresando un número de índice. Mediante:
self.plan = self.planes[elegir_plan]
Lo que estoy haciendo, es traer el “nombre” (valor) del tipo de plan almacenado en la tupla planes.
Los datos del servicio a cotizar como “descripción” y precio, los he guardado en el diccionario lista_precios. Recordemos que al diccionario se accede por nombre de clave. Éste, lo obtuve antes haciendo self.planes[elegir_plan]
.
Entonces, accedo al diccionario para traerme la lista, que contiene descripción del servicio e importe, utilizando como clave, el nombre del plan:
datos_servicio = self.lista_precios[self.planes[elegir_plan]]
Almaceno la lista correspondiente al plan en una ueva variable llamada datos_Servicios.Pero esta variable, es una lista. Entonces, para obtener el servicio, debo recurrir al índice 0:
self.servicio = datos_servicio[0]
Y para obtener el importe, al índice 1:
importe = datos_servicio[1]
Finalmente, formateo el importe con float():
self.importe = float(importe)
Chuleta #1
Con nuestra lista de precios hemos aprendido sobre:
Tuplas
Crear | mi_tupla = ('texto', 100, 25.83, False) |
Acceder | print mi_tupla[1] # Imprime: 100 |
Modificar | No se puede! |
Listas
Crear | mi_lista = ['texto', 100, 25.83, False] |
Acceder | print mi_lista[2] # Imprime: 25.83 |
Modificar | mi_lista[0] = 'Otro valor' |
Diccionarios:
Crear | dict = {'clave':'dato', 'otra_clave':155} |
Acceder | print dict['otra_clave'] # Imprime: 155 |
Modificar | dict['clave'] = 'Texto' |
Recorrer listas, tuplas y diccionarios con bucle for
flores = ['rosa', 'jazmín', 'crisantemo']
for flor in flores:
print 'Flor de ' + flor
Imprimirá:
Flor de rosa
Flor de jazmín
Flor de crisantemo
Convertir un literal a entero:
literal = '234'
int(literal)
En el siguiente capítulo veremos como logramos utilizar plantillas HTML para nuestros presupuesto y como fue el proceso para almacenarlos. Ahora, un desafío extra…
Nuevo reto
Mirando el método que se encuentra en la línea 72 de nuestro módulo Presupuesto:
# Armar numero de presupuesto def armar_numero_presupuesto(self): contador = open('contador.txt', 'r+') # Abro contador ultimo_num = int(contador.read()) # obtengo ultimo numero nuevo = ultimo_num+1 # genero nuevo número contador.seek(0) # muevo cursor a byte 0 nuevo = str(nuevo) # convierto numero a string contador.write(nuevo) # sobreescribo el número contador.close() # cierro contador self.numero_presupuesto = nuevo # seteo el nuevo número
Leyendo los comentarios a la derecha de cada línea ¿Alguien se anima a explicar por qué luego de abrir un archivo, leerlo y antes de escribirlo se utiliza contador.seek(0)
para “mover el cursor al byte 0”?
Vamos a ver esto de forma detallada en el siguiente capítulo, pero ¿quién se anima a tratar de deducirlo y explircarlo?
Muchas gracias por este material, siendo la tercera entrega del curso estoy mas que fascinado.
Hola Ellery!
Siempre primero en los comentarios!! Bien ahí!! Habrá que buscar algún premio por ello 😉
Un abrazo Ellery!!
Echándole un vistazo así rápido pienso que el método seek, te permite tomar como para metro una posición dentro del archivo al escribir el código, que en este caso como es 0 debería ser el principio del archivo “SUPONGO” que mientras se vaya incrementando 1,2,3 dará un espacio a la vez y empezara a escribir, depende el valor que se le asigne.
entonces el proceso seria :
contador = open(‘contador.txt’, ‘r+’) # Para abrir el contador
ultimo_num = int(contador.read()) # Lee el ultimo numero ingresado
nuevo = ultimo_num+1 # Agrega un numero mas al contador si era 100 sera 101
contador.seek(0) # Y establece que el inicio de la escritura sera al principio del archivo
para que solo se guarde un numero, porque lee todo el archivo y si no movemos el cursor al byte 0 guardaria 100101 (eso creo, preo voy a probar el programa)
genial tutorial, la verdad estoy aprendiendo mucho! los martes se han convertido en mi día preferido de la semana! jaja
con respecto a lo de poner el cursor en 0, según mi deducción es que como al crear el fichero escribimos datos (en este caso 100), el puntero a ese fichero se encuentra en el final del fichero, por lo tanto hay que mover el puntero al principio (posición 0) para sobrescribir!
Saludos! y gracias!
Hey Pablo !! apoyo tu deducción
saludos!
Se mueve el cursor a 0 para regresar al principio de la linea/archivo y poder sobre-escribir bien el numero del contador?.
Bueno creo.
Hola! Alguien ha tenido problemas al ejecutar este archivo?
Saludos!
=) yo quiero premio, por cierto estoy tratando de hacer algo con sql y si lo hace pero me manda error, espero que lleguemos pronto a lo de las bases de datos para saber de que va, ahora pasando a lo de seek, creo que es para movernos dentro del archivo y saber en donde vamos a escribir y pues 0 me suena a que emepezamos a escribir en el principio del archivo.
*Ovación de pie para todos*
¡No puedo creerlo! ¡Qué emoción! Excelente deducción la de todos!!
Efectivamente, el cursor se mueve al inicio del archivo (al byte 0) para poder sobreescribir el archivo, ya que al leerlo, lo dejamos al final del archivo.
Ellery, ya pensaré en un premio 😉
Y, ya llegaremos a bases de datos. Mientras tanto, puedes ir adelantándote con este artículo: http://python.org.ar/pyar/DbApi
Ulises ¿qué problema estás teniendo con el archivo?
Gracias Eugenia…Eres la mejor maestra del mundo…..E aprendido mucho en solo tres clases……..
Hola excelente titorial
Pero a mi me aparece el siguiente error despues que intento ingresar fecha de caducidad
Traceback (most recent call last):
File “E:\Programacion\python\capitulo3\presupuesto.py”, line 148, in
presupuesto = ModeloDePresupuesto()
File “E:\Programacion\python\capitulo3\presupuesto.py”, line 145, in __init__
self.armar_presupuesto()
File “E:\Programacion\python\capitulo3\presupuesto.py”, line 105, in armar_presupuesto
self.armar_numero_presupuesto() # traigo numero de presupuesto
File “E:\Programacion\python\capitulo3\presupuesto.py”, line 74, in armar_numero_presupuesto
contador = open(‘contador.txt’, ‘r+’) # Abro contador
IOError: [Errno 2] No such file or directory: ‘contador.txt’
>>>
Tengo tal cual los directorios
Gracias
Hola Ricardo!
Fíjate desde que directorio estás ejecutando el módulo presupuesto.py
El problema por el cual falla es que no encuentra el archivo contador.txt
Las causas pueden ser:
1) Qué el archivo contador.txt no esté en el directorio indicado: debe estar dentro de la carpeta capitulo3
2) Causa más probable: que al ejecutar el módulo por consola, lo estés haciendo fuera del directorio capitulo3, por ejemplo
python capitulo3/presupuesto.py
Generará que el archivo contador.txt se busque dentro de la carpeta padre “E:\Programacion\python\” de capitulo3
Si es este último el problema, simplemente navega con el comando
cd
hasta capitulo3 y ejecuta el módulo desde ahí con:python presupuesto.py
Coméntame si pudiste solucionarlo!!
Hola a todos, aunque un poco tarde pero aqui estamos. Tuve algunos problemas con el archivo modificado -queria hacerlo paso por paso y probe ir modificando el archivo original pero me enrede un poco – pero ya esta aunque me costó ya me corrió el programa y aunque tuve algunos problemas con la indentación – todavía me cuesta adaptarme a esto -.
Estuve investigando un poco sobre el seek y mis compañeros tienen razón, mueve el cursor a una posición determinado – en el caso del ejemplo al inicio para sobreescribir en el archivo el valor -.
Es emocionante poder compartir con ustedes, me ha servido de mucho.
Pd. una pregunta al momento de abrir el archivo no se les desconfigura, a mi sí por eso me tarde un poquito en arreglarlo….
Eugenia una pregunta.. en los ejemplo dices que se ejecuta un modulo escribiendo “PYTHON NOMBRE DEL MÓDULO” pero cuando lo hago así me da error, y si sólo escribo el nombre del módulo me lo ejecuta bien, creo que es por la versión de windows.. estuve investigando pero no he encontrado nada respecto a esto.
El código me funciono perfecto. Al inicio me salían algunos errores, pero es porque los campos numéricos no están “validados”. Pero en general funciona genial! Gracias y abrazo! Hasta the next step! 😉
Muchisimas gracias fue una tontera mia ya que el block de notas me guardo el archivo como txt.txt jaja no tontera
muchas gracias nuevamente
[…] no? Pues andando, acá tiene el link: Avanzando con Python. Etiquetas: Curso, Desdelinux, Guia, Maestrosdelweb, manual, […]
Excelente Drick!! Y que bueno que hayas intentado adaptar el módulo a los cambios! Es normal Y ESTÁ SUPER BIEN que te enredes con los cambios! Pues son muchos y recién estamos comenzando. Pero EXCELENTE que hayas podido resolverlo!
Con respecto a tu pregunta ¿a qué te refieres con que el archivo se te desconfigura?
A ver… no debería generar error. Lo que debes tener en cuenta es lo siguiente.
En Windows, debes abrir la terminal directamente desde Inicio > Ejecutar y allí escribir cmd.exe (o solo cmd).
Una vez allí verás algo como C:>
Ahí debes navegar hasta la carpeta donde se encuentra el archivo con el comando cd.
Por ejemplo:
C:> cd mi_carpeta
C:\mi_carpeta> cd subcarpeta
C:\mi_carpeta\subcarpeta>
Y así hasta llegar a la carpeta donde tienes el archivo presupuesto.py
(también puedes hacer cd toda\la_\ruta)
Una vez que estés dentro de la carpeta capitulo3 debes escribir:
python presupuesto.py
Eso no debería generar error (siguiendo los pasos que te comenté)
Si te genera error, selecciona el texto completo que te muestra y postealo aquí para que podamos ver que está sucediendo.
Exacto! Aún no están validadas las entradas. Si bien llegaremos a eso más adelante ¡No dudes en ir probando como se podrían validar!! Siempre puedes recuperar el archivo original, y a prueba y error SE APRENDE!!
Un abrazo y espero verte en la cuarta entrega!
jajaja suele suceder! yo vivo guardando imágenes .png.png y tardo horas en darme cuenta el problema, jajaja
Mi error es el mismo que tiene Ricardo, tengo los directorios tal cual explica el tutorial pero me da ese error, lo estoy ejecutando desde la carpeta de capitulo3, ademas de eso también tengo problemas con poner “python presupuesto.py” me dice que python no es un comando que reconozca, pero si solo pongo presupuesto.py si abre. :/
Ja! como lo dije, era el mismo problema! ya quedo resuelto, al parecer también me guardo como txt.txt (no recuerdo haber agregado yo la extensión O.O )
Gracias!
Windows y sus complicaciones van a matarme de un disgusto. Sépanlo (avísenle a Bill Gates que moriré por su culpa) 😛
Cuando digo que el archivo se desconfigura quise decir que se abre en el block de notas todo el texto recorrido y no se visualiza donde estan los saltos de línea o las indentaciones. Aunque el archivo si corre y se ejecuta.
te posteo el error que me da:
**
C:\python\CAPITULO 3>PYTHON PRESUPUESTO.PY
“PYTHON” no se reconoce como un comando interno o externo,
programa o archivo por lotes ejecutable.
**
pero repito al colocar solo el nombre del archivo todo bien..!!!!
Esta chida esta guía, hasta yo le entendí…
OT: quisiera saber donde me puedo registrar para no estar escribiendo siempre mis datos, sino, loguearme e ir directamente a escribir el comentario.
Muchísimas gracias por como te estas currando el tutorial Eugenia, he de decir que siempre he sido seguidor de maestrosdelweb y forosdelweb pero hoy por hoy me habéis dado una razón mas para daros las gracias y ofreceros mi apoyo (no económico que soy pobre jaja) y ánimo para que continuéis así.
Drick, el bloc de notas es el famoso notepad de Windows? Creo, CREO, estoy casi segura (si mal no recuerdo) que el block de notas de Windows tiene una opción en el menú ver, o editar o en alguno de sus menúes que se marca para que te respete los saltos de líneas (revisa todos los menú, algo hay seguro).
Otra cosa: no es muy cómodo usar el block de notas (si es el notepad.exe de Windows). Fíjate en el primer capítulo de la guía, hay un link para descargar Notepad++. Incluso, tiene una versión portable que no necesita instalación.
Y pregunta: ¿por qué en
C:\python\CAPITULO 3>PYTHON PRESUPUESTO.PY
aparece todo en mayúsculas?Gracias Eiwazh!!!
Hola Eugenia, cierto utilizar el notepad de windows es un dolor de cabeza ya descargue e instalé el notepad++ y es mejor. Ahora lo de “python\CAPITULO 3” aparece en mayúscula porque al nombre de la carpeta está en mayúscula, pero igual no me afecta -creo-. Ya probe con python y con PYTHON y no corre los módulos por eso mejor les coloco solo el nombre y si funcionan. De verás amigos alguién más tienen windows 7 que me diga si les da el mismo error..????
No deberías tener problemas con la carpeta CAPITULO 3 en mayúscula, pero ojo con las carpetas dentro de esta. Deben estar en minúscula.
Para que python corra solo poniendo “python” en cmd, debes tener en las variables de entorno la ruta de la carpeta de Python (imagen: http://bit.ly/tR9Rjw ). O posicionarte en cmd en el directorio donde tengas instalado python (imagen: http://bit.ly/u2aIPs ). Y así se corre un modulo http://bit.ly/umQgtv
También puedes usar IDLE que trae python (imagen: http://bit.ly/vzsuGr ), ahí puedes abrir, crear y editar módulos. Ademas de correrlos directamente con la tecla F5.
Y de la forma como te resulta a ti, que es con doble click en el “presupuesto.py” o en cmd solo ejecutando presupuesto.py. Esto funciona si se tiene configurado que los archivos .py se abran con python.exe (imagen: http://bit.ly/vWRHAc )
Saludos.
Excelente explicación Manuel!
Haré referencia a este post para los próximos usuarios Windows con problemas para ejecutar los archivos
Pues como comenté en uno de los primeros post del primer capítulo, entre Windows y yo hay un abismo!
Millones de gracias por tomarte el tiempo para explicarlo y capturar las pantallas!!!!
Un abrazo!
Nice nice nice… me parece bueno el metodo que est’as usando para el aprendizaje, una pregunta sacar’as libro o algo?
Primero agradecerte el esfuerzo y el empeño que le pones al curso Eugenia, segundo comentarte una pequeña duda que no consigo solucionar por mucho que googleo, ¿Como puedo modificar la ruta de apertura por defecto de MS-DOS?, lo único que he podido encontrar ha sido cambiar la letra de disco, pero no cambiar el directorio por defecto al ejecutar cmd, más que nada es por ahorrar tiempo buscando los .py que uso de prueba.
Gracias y un saludo!
pd: uso W7
Muy interesante el articulo.
Nunca habia tocado este tema, pero creo que con vuestra ayuda, y tutoriales como este aprendere rapido.
Un saludo
Muy buenos tutoriales, me han servido bastante. Felicidades!
Avanzando un poco en el tema, estuve viendo como se generaban los templates, y vi que se usan variables tipo PHP ($variable) , busque en el codigo de Python y vi algo que me causo la duda:
diccionario = dict(nombre=self.encabezado_nombre,
web=self.encabezado_web,
…
total=self.neto,
limite=self.vencimiento)
es esa funcion la que lo convierte a $variable? de self.vencimiento a $limite?
Aquí Manuel te dice como: http://www.maestrosdelweb.com/editorial/guia-python-plantilla-html-lista-precios/#comment-193731
Sirve mucho leer los comentarios de otras personas.
Ya leí aquel comentario en su momento pero no me refiero a eso, sino a cambiar el directorio cuando ejecutas cmd,por ejemplo:
C:\Users\(mi usuario)> _ y yo quiero que al ejecutar cms se abra en otra ubicación, que no me cuesta nada navegar, pero ya no me quiero quedar con la duda.
grande Eugenia!!! tremendo curso se está mandando!! gracias totales!!
jajaja gracias cristian!!
Hola Juan! Gracias por tu comentario!!
Te cuento: en realidad, si bien el signo $ para quienes programamos en PHP nos lleva a la confusión con variables, los signos $ que utiliza Python NO representan variables sino identificadores.
Los identificadores no son más que “comodines”. Por ejemplo, en PHP podrías utilizar un template HTML escribiendo “comodines” para luego reemplazar dinámicamente. Ejemplo:
Nombre y apellido: {NOMBRE}
y luego con str_replace() modificar dinámicamente {NOMBRE} por un dato dinámico (por ejemplo, traido de un formulario $_POST[‘NOMBRE’]).La diferencia, es que para utilizar identificadores en Python, Python OBLIGA a colocarlos con un signo $ delante (no serviría de nada de lo contrario).
La clase dict() lo que hace, es crear un diccionario con esos identificadores. Donde, para cada identificador que hayas colocado, habrá una clave en el diccionario que dirá por cual dato reemplazarlo.
Es decir, si creas un identificador llamado $titulo_cancion, luego deberás crear un diccionario que contenga una clave llamada “titulo_cancion”, seguida del dato que reemplazará el identificador:
dict(titulo_cancion='Fortunate Son')
Si bien a nivel visual, uno puede creer estar viendo (dentro de dict) que se están convirtiendo variables, técnicamente no es lo que está sucediendo, sino, se que se están asignando valores a determinadas claves.
Lo que voy a decir, no solo no es académicamente correcto, sino que además ameritaría que se me rían en la cara, pero no importa, lo diré igual: imagina a dic() como un array de PHP, donde el nombre de los identificadores es una clave. Claro que dict() cumple una función muy distinta a la de un array (por eso alguien podría asesinarme por este paralelismo), pero creo que ayuda mejor a entenderlo:
dict(titulo_cancion='Fortunate Son')
PODRÍA (aunque no es real y es incorrecto hacerlo) compararse con:array('tutolo_cancion'=>'Fortunate Son');
Es decir: los identificadores de tu Template (en Python) se convierten en CLAVES de un diccionario, pero no en variables
Gracias Manuel por contestar a mi pregunta y quitarme la duda. Te estoy agradecido.
Hola Juan!
Encontré algo que tal vez te sirva: http://yatocaba.wordpress.com/2009/05/01/truco-windows-abrir-terminal-en-una-carpeta-concreta/
El tutorial explica como crear una nueva opción en el menú de opciones, para abrir la terminal en una carpeta determinada.
No lo he probado (y no tengo a mano ningún ordenador con Windows para probarlo), PERO las indicaciones que se describen en el tuto, parecen tener lógica (todo indica que debería funcionar).
Si lo pruebas y te da resultado, por favor, no olvides comentármelo así ya me quedo tranquila que ha servido
Un abrazo!!
Tengo un par de problemas, realmente uno, trato de ejecutar el código pero no me deja, es el mismo error de “no consigo los archivos en las carpetas” pero el problema radica en que ya tengo todo como indicaste y sigue molestándome, jaja no puedo evaluar todo el código como tal. Voy entendiendo a pasos la lógica de python y me parece cómoda aunque me cuesta asimilarla un poco por la costumbre al C++, pero nada que releerme las clases y el ebook de Python para todos no me ayude a disipar, y que la práctica no resuelva.
Eu gracias por el link, encontré la solución 😉 , tal y como dice, metiendo un par de claves en el registro puedes abrir una terminal con la ubicación “predeterminada” que quieras con click derecho y seleccionando en el menú contextual, esto en WXP, a mí me sirvió un comentario que había en ese mismo post, que dice que en W7 esa opción aparece en el menú contextual pulsando shift + click derecho, ahorraré algo de tiempo y la duda queda resuelta, un abrazo.
Genial! Qué buena noticia!
Buenas,
Estoy siguiendo el curso y me parece estupendo, aunque yo lo estoy haciendo bajo Python 3. Al ejecutar el código desde IDLE me encuebtro con un error de sintaxis en la línea 98, columna 93:
print(‘\n\tOpción incorrecta. No se guardó el presupuesto.\n\n’) self.guardar_presupuesto(txt, html)
No veo qué puede ser lo que está ocurriendo, pues no identifico dicho error e IDLE tampoco me dice nada más. ¿Hay alguna manera de identificar en condiciones este tipo de errores?
Gracias y un saludo.
Ya encontré el error, se subió la línea de self.guardar_presupuesto a la de print…
Genial Juan! Me alegro que lo hayas solucionado
buenas noches,
yo estoy trabajando desde win7 y trabajo con el IDLE, ahora cuadno trato de ejecutar el archivo, me sale una ventana que dice, Invalid sintax , y aparece iluminado la linea 88
print txt
Hola Jasson!
¿tendrás Python 3? De ser así, ten en cuenta que estamos trabajando con Python 2.x. En Python 3, deberás escribir print(txt)
Prueba a ver si eso lo soluciona. Es muy probable que tengas P3
Que tal!
Eugenia, solo para darte las gracias por compartir tus conocimientos, realmente haces ver la programación como algo sencillo y divertido =)!
Saludos ^__^
Eugenia!! Eres una chica que vale mas que oro con todo lo que escribes, no se como agradecerte el gran trabajo que has hecho y haces dia a dia con la comunidad programadora, mil gracias, y muchisimas felicitaciones por todo tu trabajo y estoy seguro que no me perdere tu conferencia del sabado 19. =)
Gracias Julio!!!!!!!
Y sip, justamente la idea es hacerlo sencillo y si divierte ¡Mejor!!!! 😀
Un abrazo!!
Gracias Juan Carlos!!!!!!!!!!!!!!!!
Otra vez felicidades muy buena capitulo de tu guía. :p
Tengo que agredecer este tuto muy bueno que me esta ayudando a por fin hacer algo con python y a la vez aprender mas acerca. De todo este codigo tengo una pequeña duda, no entiendo lo siguiente:
self.servicio = datos_servicio[0]
importe = datos_servicio[1]
self.importe = float(importe)
Si podrian darme una explicacion para ahora si comprender completamente este codigo. Saludos.
Lo he entendio, con un poco mas de lectura.
Buenísimo entonces, Diego! ¿seguro que no te quedaron dudas? Si quedó alguna, no dudes en preguntarlas!!
Saludos!!
Hola, aplique el código que indicaste, pero no se aplica esto al presupuesto. Porque? en donde interviene estas lineas??
Hola chili!
Si no estás pudiendo ver los cambios, por las dudas haz lo siguiente:
Elimina el archivo presupuesto.pyc (NO .py, sino .pyc)
Vuelve a abrir la terminal y ejecútalo nuevamente.
Si aún sigues sin ver los cambios, vuelve por aquí y coméntame cuáles cambios no aparecen así vemos el código
NO ME FUCIONA, EJECUTO DESDE MS-DOS DE KA SIGUIENTE MANERA Y ME SALEN ESTOS ERRORES..
C:\Python27>python capitulo3/presupuesto.py
===========================================================================
GENERACIÓN DEL PRESUPUESTO
===========================================================================
Empresa: x
Nombre del cliente: a
Fecha: 03-03-2011
Servicio ofrecido (0)corporativo (1)personal (2)mantenimiento :
Fecha de caducidad: 05-06-2011
Traceback (most recent call last):
File “capitulo3/presupuesto.py”, line 148, in
presupuesto = ModeloDePresupuesto()
File “capitulo3/presupuesto.py”, line 145, in __init__
self.armar_presupuesto()
File “capitulo3/presupuesto.py”, line 105, in armar_presupuesto
self.armar_numero_presupuesto() # traigo numero de presupuesto
File “capitulo3/presupuesto.py”, line 74, in armar_numero_presupuesto
contador = open(‘contador.txt’, ‘r+’) # Abro contador
IOError: [Errno 2] No such file or directory: ‘contador.txt’
Mario, como comenté anteriormente, tenés que navegar hasta la carpeta capitulo3 para poder ejecutarlo:
C:\Python27\capitulo3>python presupuesto.py
El error: IOError: [Errno 2] No such file or directory: ‘contador.txt’ está justamente diciendo que no encuentra el archivo contador.txt, pues lo está buscando dentro de C:\Python27.
Saludos!
Ami tambien me dava problemas pero lo logre solucionar :D, los problemas q me encontre fueron estos miren:
txt = self.leer_plantilla(self.txt) # Contenido TXT
html = self.leer_plantilla(self.html) # Contenido HTML
y lo que pasaba q decia leer_plantilla(self, self.txt) e igual con el de html entonces aunq una funcion requiera la variable self creo q no se pone cuando se manda a llamar a dicha funcion y otras cosas que vi pero q solo eran para ahorrar espacio y lineas de codigo son estas mira:
elegir_plan = int(raw_input(texto_a_mostrar))
# elegir_plan = int(elegir_plan) # int() convierte a número entero
self.plan = self.planes[elegir_plan]
datos_servicio = self.lista_precios[self.plan]
# datos_servicio = self.lista_precios[self.planes[elegir_plan]]
self.servicio = datos_servicio[0]
self.importe = float(datos_servicio[1])
# self.importe = float(importe)
si se fijan bien me ahorre un par de lineas 😀 quiza en proyectos chicos no sea gran diferencia pero ya en un gran proyecto puede ser de mucha ayuda entiendan lo que hice asi es mas divertido 😛
en este punto el programa ejecuta sin problemas pero al terminar de almacenar los datos y seleccionar que deseo o no guardar, se cierra automáticamente sin mostrar ningún reporte pero el archivo contador si se modifica y aumenta como esta destinado! ¿¿Alguien mas tuvo este problema?? Como puedo solucionarlo, no quise agregar un input solo para mantener la pantalla porque ley en un post anterior que era mala practica.¿¿ Hay alguna función que me permita mantener la pantalla hasta que presione alguna tecla???
tengo este problema en el codigo perdon por muy tarde solo que no he tenido en estar en el curso:
josuechaqui@Chaqui-Ubuntu:~/Escritorio/capitulo3$ python presupuesto.py
================================================================================
GENERACIÓN DEL PRESUPUESTO
================================================================================
Empresa: casa
Nombre del cliente: Juan
Fecha: 03-03-2011
Servicio ofrecido (0)corporativo (1)personal (2)mantenimiento : 2
Fecha de caducidad: 04-03-2011
¿Desea guardar el presupuesto? (s/n): s
Traceback (most recent call last):
File “presupuesto.py”, line 148, in
presupuesto = ModeloDePresupuesto()
File “presupuesto.py”, line 145, in __init__
self.armar_presupuesto()
File “presupuesto.py”, line 134, in armar_presupuesto
self.guardar_presupuesto(txt, html) # ofrezco guardarl presupuesto
File “presupuesto.py”, line 92, in guardar_presupuesto
presupuesto = open(filename, ‘w’) # Creo el archivo
IOError: [Errno 2] No such file or directory: ‘presupuestos/102.html’
ya encontre mi error jejejejejeje
¿tienes dentro de capitulo3 una carpeta llamada presupuestos?
Hola Carlos!
Seguramente estás utilizando Windows y ejecutando el archivo con doble clic.
Fíjate al comienzo de la guía (capítulo 1), como deben ejecutarse los scripts de Python.
Saludos!
[…] capítulo: Listas, tuplas, diccionarios y estructuras de control → […]
Hola Eugenia Bahit.
Tengo un problema con este ejemplo, lo ejecute y me dice que no encuentra el archivo/directorio ‘presupuesto’, pense que es la carpeta que nombre ‘presupuestos’ asi que le elimine la ‘s’, seguido de eso ya no me dio problema pero encontro otro, ahora me dice el modulo ‘_main_’ en ‘presupuesto’.
Espero su ayuda y la de todos los compañeros, saludos.
[me falto escribir :D]
ahora me dice que no encuentra el modulo ‘_main_’ en ‘presupuesto’
Maravillada con este curso y recursos compartidos. Siglos que no programo y al ver estas cosas recuerdo mi época de estudiante enamorada de mi carrera. Me encanta la lógica y los retos. Gracias Eugenia.
Excelente, costo pero salio lindo reto…
Vane, que bueno eso!!!!!!
No hay nada más gratificante que amar lo que uno hace
Bienvenida a la guía para “apasionados”!!! :))
Un abrazo!
Hola, Eugenia: Perdona por llegar tarde al curso, pero me enteré ayer por un retweet. Espero que puedas leer este comentario y ayudarme con las soluciones, ya que me da varios errores.
No he tenido problemas con el primer capítulo, pero sí con este. He descargado los archivos correspondientes a este capítulo; los tengo instalados en c:/PruebasPython/Capítulo3/.
Comentarte también que la versión que tengo es la 2.7 corriendo bajo windows Vista.
Al ejecutar el archivo me marca errores inmediatamente después de introducir la fecha de caducidad.
line 146 in (module)
presupuesto=ModeloDePresupuesto()
line 143 in __init__
self.armar_presupuesto()
line 112 in armar_presupuesto
txt = self.leer_plantilla(self,self.txt) # Contenido TXT
Type Error: leer_plantilla() takes exactly 2 arguments (3 given)
El archivo contador, efectivamente suma 1 pero el programa no realiza el resto de las acciones.
Por otra parte tengo otra duda. En la línea:
def leer_plantilla(self, archivo):
archivo viene dado por los parámetros:
txt = self.leer_plantilla(self, self.txt) # Contenido TXT
html = self.leer_plantilla(self, self.html) # Contenido HTML
Lo que no entiendo es self.txt y self.html. Para llamar a un determinado archivo, no habría que ponerle el nombre template.txt y template.htm.?
Por otro lado y por si a alguien le interesa, como editor de código estoy usando el conocido PSPad, que resalta palabras reservadas, comentarios, cadenas, etc. Además soporta varios lenguajes de programación y, aunque no tiene depurador de código, ofrece una interfaz más agradable que los típicos editores de Windows, tipo notepad, etc. Se puede descargar desde http://www.pspad.com
Perdón por el tostón del post. Espero que puedas ayudarme y sobre todo felicitarte por este curso, que está super interesante. Muchas gracias por todo. 😀
Siento llegar muy tarde, pero más vale tarde que nunca.
Tengo el siguiente y peculiar error error:
File “presupuesto.py”, line 134
html = Template(html).safe_substitute(diccionario)type filter text
^
SyntaxError: invalid syntax
Esta guía me tienes sorprendido, Gracias Eugenia es una Maestra Excelente.
No se si estoy llegando tarde a la fiesta pero debe saltarte un paréntesis antes de esa linea eso me paso varias veces( culpa de viejo y rustico techado) 😉 Suerte!!!
Buenisimo el tutorial, voy en este capitulo y voy facinado, por el contenido y mas por la metodologia de ensennanza, Felicitaciones!!!
me sumo a lo que preguntaron, si despues de esto sacaras algun libro, si es asi me sumo para comprarlo. avisen saludos!
PD: notable como te das el tiempo y paciencia para explicar cada post, bueee saltare al capitulo 4
Tengo el mismo Error… ¿Como lo Solucionastes?
Muy bueno, quería aprender este lenguaje de programación y espero continuar después con AJAX.
Muy interesante, un saludo ‘Maestros’!
Hola Euge.
Yo estoy con Debian Whezzy 32 bit en una pequeña chatarrita de 10″ Asus.
Genial, ya llevo el paso adecuado, me ha costado mucho pero por fin estoy aquí y por ahora bien. Un millón de gracias.
Saludos…
Saludos,
En el siguiente párrafo no debería ser ‘cinco’ en lugar de ‘cuatro’?:
“Como verás, hemos agregado cuatro nuevas propiedades de clase a nuestro módulo. Pero, el tipo de datos, no es ninguno de los que ya hemos visto! Pertenecen a tres nuevos tipos de datos: tuplas, listas y diccionarios.”
Pues yo he llegado más tarde que tú.
Acabo de llegar y me da el mismo error que a tí.
Traceback (most recent call last):
File “presupuesto.py”, line 146, in
presupuesto = ModeloDePresupuesto()
File “presupuesto.py”, line 143, in __init__
self.armar_presupuesto()
File “presupuesto.py”, line 112, in armar_presupuesto
txt = self.leer_plantilla(self, self.txt) # Contenido TXT
TypeError: leer_plantilla() takes exactly 2 arguments (3 given)
Por lo que veo, txt está definido en la línea 20:
txt = ‘templates/template.txt’ # Plantilla TXT
…y los argumentos pasados son 2: self y self.txt
Seguiré revisando a ver si doy con el error
Por cierto.
¿Para qué se le pasa a leer_plantilla el parámetro self si no se usa?
Eugenia, ¿nos podrías decir qué está fallando?
Estoy utilizando Ubuntu y tanto el archivo presupuesto.py como la carpeta templates está dentro de mi carpeta personal.
Muchas gracias.