2009-09-23 4 views
0

Donc j'essaie de comprendre le fichier source de csv2rec dans matplotlib.mlab. Il est utilisé pour prendre un fichier csv et analyser les données dans certains formats. Il peut donc prendre une chaîne '234' et la convertir en int. ou prenez une chaîne de date et rendez-la dans des datetime python.Comment cela fonctionne-t-il?

def get_converters(reader): 

    converters = None 
    for i, row in enumerate(reader): 
     if i==0: 
      converters = [mybool]*len(row) 
     if checkrows and i>checkrows: 
      break 
     #print i, len(names), len(row) 
     #print 'converters', zip(converters, row) 
     for j, (name, item) in enumerate(zip(names, row)): 
      func = converterd.get(j) 
      if func is None: 
       func = converterd.get(name) 
      if func is None: 
       #if not item.strip(): continue 
       func = converters[j] 
       if len(item.strip()): 
        func = get_func(name, item, func) 
      else: 
       # how should we handle custom converters and defaults? 
       func = with_default_value(func, None) 
      converters[j] = func 
    return converters 

Mon problème avec cette fonction est 'convertisseurs'. Il commence comme Aucun. Puis plus tard, func = convertisseurs [j] 'j je sais est un nombre qui vient d'être créé par énumération. Donc, il cherche l'élément convertisseur correspondant indexé par j. Mais il n'y a rien dans les convertisseurs parce que ce n'est pas vrai? A moins que les programmes python n'aient pas à être lus de haut en bas? Dans ce cas, nous obtenons la fonction des deux lignes suivantes "if len (item.st .... etc)" ou de la section "else:". Mais, j'ai juste supposé qu'il devrait être lu de haut en bas.

Je ne sais pas si d'autres choses sont importantes, alors j'ai simplement inclus toute la fonction. converterd est un mappage de dictionnaire je crois que l'utilisateur peut fournir comme un paramètre pour trouver un convertisseur automatiquement. checkrows est juste un nombre fourni par l'utilisateur en tant que paramètre au début pour vérifier la validité. C'est par défaut Aucun. Je suis encore un peu débutant, donc juste fyi. =)

Merci à tous. Ce site est tellement utile!

Répondre

2

Converters se prépare à nouveau à la début de la boucle avec

if i==0: 
    converters = [mybool]*len(row) 

Alors après, ce n'est plus rien.

1

À moins que je me manque quelque chose, la première itération "i" est 0, de sorte que le suivant est exécuté:

converters = [mybool]*len(row) 

et que "convertisseurs" initialise

1

Premièrement,

converters = None 

fixe une valeur initiale pour converters. De cette façon, si l'itération ne se produit pas (parce que readers peut être vide) alors quand la fonction retourne converters elle existera et aura la valeur None.

Si l'itération sur readers se produit, alors converters est remis à zéro immédiatement à une valeur plus significative dans la première passe par l'itération (lorsque i==0):

converters = [mybool]*len(row) 
Questions connexes