12h29 : le parser actuellment ne gère pas la possibilité qu’il n’y ai pas de ligne de titre pour les colonnes, je vais le rajouter.
l’option est assez simple. si rien n’est mentionné le parser suppose qu’il y a une ligne de titre a récupéré. si une liste nom de colonne est passée en argument (genre column_names=['colonne A', 'colonne B', 'colonne C'] elle est utilisée comme liste par défaut. si l’argument est column_names=None, alors la liste de nom de colonne sera choisie arbitrairement (par ex col_0, col_1, col_2).
j’en ai profité pour modifié un peu l’__init__.
on peut lui passer une liste d’argument en entrée.
les mots clés reconnus pour l’instant sont filename, file, file_arg, tous les 3 pour le nom du fichier a parser (c’est juste pour laisser plus de liberté) et column_names.
def __init__(self, **arg): ''' x = Items(**arg) open and read the file to parse. parse it according to the specified options arg keys : file, filename or file_arg -> str, identifier for the file to parse column_names -> optional. must be NOT specified if the column names are in the file to parse must be specified if there is no column names in the file. - column names are given as a list or tuple - if value None affected, column names will be assigned automatically. ''' #initialize a flag dictionary self.flag = {} #get the column_names argument self.flag['column_names'] = arg.get('column_names', False) #get the filename argument (3 possibilities) file_arg = arg.get('filename', '') if not file_arg : file_arg = arg.get('file', '') if not file_arg : file_arg = arg.get('file_arg', '') try : #call get_fhin to open file_arg fhin = self.get_fhin(file_arg)
except TypeError, e : #if error of type of the argument file_arg returned, raise the error print e raise except IOError : #if problem for opening file_arg, raise the error raise #if the file is open and readable start to parse the file self.parse_file(fhin) #do some after init actions like closing files self.__end_init__(fhin)
le module de test tel qu’il est fait vérifie bien que toutes les infos ont été parsées mais ne vérifie pas que ce sont bien les bonnes données qui sont dans les bons attributs.
pour cela il me faut des accesseurs pour les items.
J’ai ajouté la méthode get_attribute() a item. cette méthode renvoie la valeur affectée à un attribut passé en argument et none si l’attribut n’existe pas.
def get_attribute(self, attr): ''' val = x.get_attribute(attr) attr -> str val -> str, int, float or boolean return the value of an attribute if exists, None if not '''
return self.get(attr, None)
j’ai également ajouté get_attr_list() à items qui renvoie la liste des valeurs affectées a un attribut passé en argument pour l’ensemble des item stockés dans la collection
def get_attr_list(self, attr): ''' values = x.get_attr_list(attr) attr -> str values -> list of str, int, float, boolean or None return a list containing values of the given attr for all items in x ''' return [item.get_attribute(attr) for item in self]
puis j’ai ajouté un nouveau module de test pour verifier que toutes les info sont bien récupérées.
def test_parsed_data(self): ''' teste si les donnees parsees sont correctes ''' header_info_1 = "header_01" header_info_2 = "header_02" col_1 = "col_1" col_2 = "col_2" col_3 = "col_3" data_l1_c1 = "data_l1_c1" data_l1_c2 = "data_l1_c2" data_l2_c1 = "data_l2_c1" data_l2_c2 = "data_l2_c2" test_file='''#%s#%s%s\t%s%s\t%s%s\t%s''' % (header_info_1, header_info_2, col_1, col_2, data_l1_c1, data_l1_c2, data_l2_c1, data_l2_c2) self.write_tmp_file(filetext = test_file) test_item = Items(file_arg = 'tmp_file') self.assert_(test_item.get_header() == [header_info_1,header_info_2]) self.assert_(test_item[0].get_attribute(col_1) == data_l1_c1) self.assert_(test_item[0].get_attribute(col_2) == data_l1_c2) self.assert_(test_item[1].get_attribute(col_1) == data_l2_c1) self.assert_(test_item[1].get_attribute(col_2) == data_l2_c2) self.assert_(test_item[0].get_attribute(col_3) == None) self.assert_(test_item[1].get_attribute(col_3) == None) self.assert_(test_item.get_attr_list(col_1) == [data_l1_c1, data_l2_c1]) self.assert_(test_item.get_attr_list(col_2) == [data_l1_c2, data_l2_c2]) self.assert_(test_item.get_attr_list(col_3) == [None, None])
remove('tmp_file')
a faire demain -> les données sont pour l’instant parsées indépendamment de leur contenu. elles sont toutes stockées comme texte. il faut que je rajoute le module de conversion…






