Archive de la catégorie «item_list»

14 février 2007 – modification de la classe abstraite item_list

février 14, 2008

Pour pouvoir utiliser item_list comme superclasse de microarray_list, il est nécessaire de pouvoir parser le fichier gpr dans item_list, or cette classe parse les fichier de façon très simple, fichier tabulé, 1 ligne d’entête et puis c tout.
l’idée est donc de faire un objet parser contenant toute les infos du fichier a parser. la classe parser aura des attribute contenant le format du fichier, le séparateur de champ, l’indicateur de texte (en option), l’indicateur de commentaire et/ou de meta-données.
14h13 : comment procéder ? je vais commencer par créer la classe et je verrais après
16h00 : la classe Parser a été créée avec un constructeur, et des méthodes qui vont bien

class Parser :
'''
class parser. define info for parsing a file
'''
attr_list = {
'field_separator' : '\t',
'text_separator' : '',
'comment_mark' : '#',
'metafield_marker' : '=',
'metafield_comment' : False,
'header_line' : True,
'format' : None
}
cvs = {
'field_separator' : '\t',
'text_separator' : '',
'comment_mark' : '',
'metafield_marker' : '',
'metafield_comment' : False,
'header_line' : True,
'format' : 'cvs'
}
gpr = {
'field_separator' : '\t',
'text_separator' : '',
'comment_mark' : '#',
'metafield_marker' : '=',
'metafield_comment' : False,
'header_line' : True,
'format' : 'gpr'
}
def __init__(self, **arg):
'''
x = Parser(**arg)
authorized arguments:
-field_separator (default TAB)
-text_separator (default None)
-comment_mark (default #)
-metafield_marker (default =)
-metafield_comment (default False)
-header_line (default True)
-format (default None)

'''
self.set_default()
for k,v in arg.items():
try :
self.set_attr(k,v)
except ParserError, e :
print e
if self.format :
self.set_format(self.format)

def set_default(self):
'''
x.set_default() set attribute value to their default value
'''
self.set_format("attr_list")

def get_format(self, format_name):
'''
format = x.get_format(format_name) sthe format parameters of a given format_name
'''
if hasattr(self, format_name) :
return getattr(self, format_name)
raise ParserError("user format %s is not defined" % format_name)

def set_format(self, format_name):
'''
x.set_format() set the attribute value to to the value describe by a given format_name
'''
try :
format = self.get_format(format_name)
except ParserError, e :
print e
return
for k,v in format.items():
try :
self.set_attr(k,v)
except ParserError, e :
print e

def set_attr(self, k, v):
'''
x.set_attr(k, v) set to v the value of a given attribute k
'''
if k in self.attr_list.keys() :
setattr(self, k, v)
else :
raise ParserError("option %s doesn't exist" % k)


Au passage la classe ParserError a été créée

class ParserError(Exception):
def __init__(self, msg):
self.msg = msg

def __str__(self):
return self.msg

avec cette classe Parser, je vais maintenant definir dans Item_list une méthode parsant les fichier en fonction de ces paramètres. le plus difficile va etre la gestion des meta-données. je pense créé un attribut metadata sous la forme d’un dictionnaire. le probleme du fichier gpr est la présence de 2 ligne en tête de fichier sans marker de commentaire. mon idée était de lire le fichier en cherchant des commentaires ou des meta-données et une fois tout ceux-ci trouvé, considerer les autres ligne comme des data.
1ere solution : pour eliminer les 2 lignes en tete du fichier gpr, je vais ajouter un attribut ’start_line’ a valeur de 3 pour un fichier gpr, 1 pour csv et 1 par defaut
2eme solution : la recherche des différents élement doit se faire par présence ou absence des autres éléments.
18:27: le parser est finis mais je ne suis pas totalement satisfait de la fonction de recherche des élements. elle se base juste sur la présence des marqueurs dans la ligne. dans le cas de mélange de ces marqueurs, on risque des bugs. il faudra surement retravailler ce parser pour qu’il soit un peu plus générique