Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Python, agrupar valores.

Iniciado por Hechelion, 04 de Marzo de 2012, 12:51:14 PM

« anterior - próximo »

Hechelion

Buenas, tengo una problema que no he logrado entender.

Tengo un archivo de texto donde almaceno unos datos:


cabecera
linea_1 ;;;;;ID_0;;;;;;;;;
linea_2 ;;;;;ID_1;;;;;;;;;
linea_3 ;;;;;ID_0;;;;;;;;;
linea_4 ;;;;;ID_2;;;;;;;;;
linea_5 ;;;;;ID_1;;;;;;;;;


Creé el siguiente programa en python, para agrupar los datos (o lineas) según sea el ID.

import struct
import sys
import glob
import os
import types
import binascii
import re

class ClsPJ:
    #Clase para almacenar los datos de cada PJ
    cadena = []   
    nombre = ""
   
    def __init__(self):
        pass
   
    def AddDato(self, dato):
        self.cadena.append(dato)
   
    def printDato(self):
        for linea in self.cadena:
            print(linea)


def leerArchivo(ruta):
    #Desglosa un archivo de log
    log = open(ruta,'r')
    for linea in log.readlines()[1:]: #Recorrermos el log, menos la primera l?nea que es la cabecera
        campos = linea.split(";") #cortamos la linea en sus respectivos campos
        if not campos[5] in lstPJ: #Si la key no existe en el diccionario
            lstPJ[campos[5]] = ClsPJ() #Creamos una entrada nueva en el diccionario
            lstPJ[campos[5]].nombre = campos[5] #escribimos la key en el objeto
        lstPJ[campos[5]].AddDato(linea) #agregamos el dato al objeto


lstPJ = {} #creamos el diccionario que contendr? los datos
leerArchivo("output.txt") #Leemos el archivo de prueba

for k, v in lstPJ.iteritems(): #imprimimos los datos para probar
    print(v.nombre)
    v.printDato()


El problema lo tengo al momento de agregar el dato a cada objeto, yo espero que la línea
" lstPJ[campos[5]].AddDato(linea) #agregamos el dato al objeto" agregue una línea a un objeto y esperaría la siguiente salida de mi programa (cada línea estaría agrupada):


ID_0
linea_1 ;;;;;ID_0;;;;;;;;;
linea_3 ;;;;;ID_0;;;;;;;;;

ID_1
linea_2 ;;;;;ID_1;;;;;;;;;
linea_5 ;;;;;ID_1;;;;;;;;;

ID_2
linea_4 ;;;;;ID_2;;;;;;;;;



Sin embargo, la salida actual de mi programa es la siguiente:


ID_0
linea_1 ;;;;;ID_0;;;;;;;;;
linea_2 ;;;;;ID_1;;;;;;;;;
linea_3 ;;;;;ID_0;;;;;;;;;
linea_4 ;;;;;ID_2;;;;;;;;;
linea_5 ;;;;;ID_1;;;;;;;;;

ID_1
linea_1 ;;;;;ID_0;;;;;;;;;
linea_2 ;;;;;ID_1;;;;;;;;;
linea_3 ;;;;;ID_0;;;;;;;;;
linea_4 ;;;;;ID_2;;;;;;;;;
linea_5 ;;;;;ID_1;;;;;;;;;

ID_2
linea_1 ;;;;;ID_0;;;;;;;;;
linea_2 ;;;;;ID_1;;;;;;;;;
linea_3 ;;;;;ID_0;;;;;;;;;
linea_4 ;;;;;ID_2;;;;;;;;;
linea_5 ;;;;;ID_1;;;;;;;;;



Como ven, por algún extraño motivo que no he logrado comprender, me crea bien los 3 objetos dentro del diccionario, pero a cada objeto le está agregando las 5 líneas en vez de agregar solo la línea que corresponde.


Por lo que entiendo, luego de hacer un montón de pruebas, es como si la variable "cadena" no fuera local y única a cada objeto, si no, que fuera una única variable global.
No me cuadra, como puede pasar eso, si "cadena" fue definida dentro de la clase (el programa es todo lo que hay ahí). En especial, si la propiedad "nombre" funciona bien, por lo cual sé que tengo 3 objetos diferentes, pero desconozco por que tengo solo una lista global en vez de tener 3 listas independientes.
¿Alguna idea?

Hechelion

Luego de una buena lucha, se me ocurrió probar algo que funciona.
moví la creación de las variables al método __init__ de esa forma pude anteponer el "self" antes de "definir" las propiedades y ahora está funcionando. Pero sigo con la duda de por que fallaba de la otra forma.


    def __init__(self):
        self.cadena = []
        self.nombre = ""






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.