[Python-es] trabajo con ciclos y arreglos

5 views
Skip to first unread message

Aldo Martinez Selleras

unread,
May 24, 2012, 11:41:45 AM5/24/12
to La lista de python en castellano
estoy trabajando en parsear un archivo .ini con el modulo ConfigParser,
y todo lo hace super el modulo, pero tengo una inquietud, que se me
traba el paraguas, a ver si me pueden dar una luz de como resolver el
tema, el codigo es basicamente este

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import ConfigParser
import re

conf = ConfigParser.ConfigParser()
conf.read('96969696.dat')

usuarios = []
sections = []
plantillas = []
sections = conf.sections()

for sect in sections:
if conf.has_option(sect,"IsTemplate"):
plantillas.append(sect)
else:
if len(conf.options(sect)) > 0:
if not conf.get(sect,'tp') == 'Default':
if not conf.has_option(sect,"c1"):
if conf.has_option(sect,'timequota'):
quota = conf.get(sect,'timequota')
usuarios.append(conf.get(sect,'timequota'))
if conf.has_option(sect,'fg'):
if conf.get(sect,'fg') == '256':
status = conf.get(sect,'fg')
usuarios.append(conf.get(sect,'fg'))
if conf.has_option(sect,'email'):
email = conf.get(sect,'email')
usuarios.append(conf.get(sect,'email'))
if conf.has_option(sect,'timeusedlastupdated'):
last = conf.get(sect,'timeusedlastupdated')
usuarios.append(conf.get(sect,'timeusedlastupdated'))
if conf.has_option(sect,'passwordlastupdated'):
lastpw = conf.get(sect,'passwordlastupdated')
usuarios.append(conf.get(sect,'passwordlastupdated'))
if conf.has_option(sect,'checkavl'):
phone = conf.get(sect,'checkavl')
usuarios.append(conf.get(sect,'checkavl'))
tused = conf.get(sect,'timeused')
usuarios.append(conf.get(sect,'timeused'))
tpl = conf.get(sect,'tp')
usuarios.append(conf.get(sect,'tp'))
print '\r'
print usuarios
#print quota

explico esto un poco!
me extrae todas las secciones,(son usuarios con sus atributos), excluyo
algunso que no me interesa, usuarios por defecto o definicion de
Plantillas de usuarios, luego voy extrayendo los atributos que mas me
interesan de cada usuario, al final cuando imprimo el arreglo `usuarios`
me va acumulando, y el ultimo me contiene TOOODOS los usuarios con sus
atributos, y quiero que por cada seccion = usuario me devuelve el
arreglo unico, la idea final es que cada usuario lo ponga en una base de
datos de MySQL, pero la parte de la base de datos la hare despues q esta
parte funcione bien

saludos y gracias de antemano
_______________________________________________
Python-es mailing list
Pyth...@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Jose Caballero

unread,
May 24, 2012, 12:03:37 PM5/24/12
to La lista de python en castellano
, al final cuando imprimo el arreglo `usuarios` me va acumulando, y el ultimo me contiene TOOODOS los usuarios con sus atributos, y quiero que por cada seccion = usuario me devuelve el arreglo unico,



si te entiendo bien (y no estoy seguro), creo que necesitas usar una matriz de dos dimensiones o, lo que es lo mismo, una lista de listas.
O eso, o reseteas a 0 tus listas en cada loop.


Suerte,
Jose

Aldo Martinez Selleras

unread,
May 24, 2012, 1:16:16 PM5/24/12
to La lista de python en castellano
me parece q eso esta bien... pero como lo hago?? ;(

soy newbie en python!

gracias

Jose Caballero

unread,
May 24, 2012, 1:54:21 PM5/24/12
to La lista de python en castellano
prueba en google algo como "multidimensional arrays in python" o algo parecido.
Deberia haber ejemplos.


2012/5/24 Aldo Martinez Selleras <al...@caonao.cu>

Chema Cortes

unread,
May 24, 2012, 2:27:17 PM5/24/12
to La lista de python en castellano
El día 24 de mayo de 2012 17:41, Aldo Martinez Selleras
<al...@caonao.cu> escribió:
> estoy trabajando en parsear un archivo .ini con el modulo ConfigParser, y
> todo lo hace super el modulo, pero tengo una inquietud, que se me traba el
> paraguas, a ver si me pueden dar una luz de como resolver el tema, el codigo
> es basicamente este

Primeramente, un consejo de estilo: cuando se puede intenta encadenar
expresiones lógicas en lugar de anidar 'ifs'. Por ejemplo:

if len(conf.options(sect)) > 0:
if not conf.get(sect,'tp') == 'Default':
if not conf.has_option(sect,"c1"):

pasaría a

if len(conf.options(sect)) > 0 and not conf.get(sect,'tp') ==
'Default' and not conf.has_option(sect,"c1"):

Aún más, podrías juntar el 'else' con el siguiente 'if' y quedar
todavía más compacto:

elif len(conf.options(sect)) > 0 and not conf.get(sect,'tp') ==
'Default and not conf.has_option(sect,"c1"):


Por otro lado, en el código estás usando variables intermedias que no
usas luego. Voy a suponer que es un código sin perfilar del todo. Tal
como está se puede eliminar muchas líneas que no sirven de nada (y que
nos habría ayudado a nosotros a saber qué querías).

Entrando en lo que hace el código, no parece una buena elección usar
una lista (que no arreglo) para meter todos los datos que vas sacando.
Acabas teniendo una lista plana difícil de manejar (y creo que es lo
que vienes a preguntar).

Te aconsejo meter los datos en un diccionario para cada usuario, y
tener una lista de diccionarios. Un trozo de código sería así:

usuario = {}

if conf.has_option(sect,'checkavl'):
usuario["phone"] = conf.get(sect,'checkavl')

usuarios.append(usuario))

Aunque existe un modo más directo para llenar esta lista:

usuarios=[dict(sect.items()) for sect in sections]


Por dejar un código similar al tuyo, aquí te pongo como lo haría yo:

mapping=(
("quota","timequota"),
("status","fg"),
("email","email"),
("last","timeusedlastupdated"),
("lastpw","passwordlastupdated"),
('phone','checkavl'),
('timeused','timeused'),
('tp','tp'),
)

for sect in sections:
items=dict(sect.items(sect))

if "IsTemplate" in items:
plantillas.append(items)
elif "c1" not in items and items.get("tp",None)!='Default':
usuario=dict((a,items[b]) for (a,b) in mapping if b in items)
usuarios.append(usuario)



--
Hyperreals *R: http://ch3m4.org/blog
Quarks, bits y otras criaturas infinitesimales

Aldo Martinez Selleras

unread,
May 24, 2012, 2:48:17 PM5/24/12
to La lista de python en castellano
bueno, primero quiero dar las gracias por las respuesta y comentar que
ya resolvi, con la idea inicial q me dieron, la de vaciar el arreglo
(lista), el tema era inicializarlo dentro del ciclo, asi funciona como
me intersaba, sobre esta ultima respuesta, estoy consciente de que no es
una lista lo mejor, pero solo para ver los resultados los estaba usando,
al final, no me es funcional el arreglo, ya q la idea final es que por
cada ciclo, ejecute una consulta SQL.

sobre los diccionarios, no tengo mucha idea de como funcionan ni cuando
utilizarlos, voy a leer un poco sobre el tema para ver como los uso.

el tema de las condiciones, he programado mucho mas en PHP q en python,
y no sabia q se podia hacer eso, mil gracias! no cabe duda que reduce
bastante el codigo, supongo q tambien ayuda a que python interprete
mejor el codigo!

si hay variables puestas de muchas pruebas q he hecho, no lo limpie lo
suficiente antes de enviar el snnipet del codigo, disculpen por eso tambien

vaya esta ultima parte del como haria ud el codigo, la verdad que se
complica un poco :); la condicion la entiendo, pero la parte del
diccionario no mucho, y el mapa, se me ocurre la idea, pero igual, tengo
q leer un poco al respecto para entenderlo.

muchas gracias una vez mas

Chema Cortes

unread,
May 25, 2012, 7:14:43 AM5/25/12
to La lista de python en castellano
El día 24 de mayo de 2012 20:48, Aldo Martinez Selleras
<al...@caonao.cu> escribió:

> el tema de las condiciones, he programado mucho mas en PHP q en python, y no
> sabia q se podia hacer eso, mil gracias! no cabe duda que reduce bastante el
> codigo, supongo q tambien ayuda a que python interprete mejor el codigo!

Todavía no conozco ningún lenguaje que no tenga expresiones lógicas:

<http://www.php.net/manual/es/language.operators.logical.php>

En cuanto a los diccionarios de python, son similares a los arrays
asociativos de php.

Ánimo, que seguro que te haces con el lenguaje.


--
Hyperreals *R: http://ch3m4.org/blog
Quarks, bits y otras criaturas infinitesimales
Reply all
Reply to author
Forward
0 new messages