Question

J'utilise un certain python pour faire une génération de nom de variable. Pour une raison quelconque, je ne fais que recevoir une partie de ce que je dois.

import sys
import csv

params = csv.reader(open('params.csv'), delimiter=',', skipinitialspace=True)

flags_r = []
flags_w = []
numbers_r = []
numbers_w = []
station = ['AC1','DC1','DC1']
drive = ['','Fld','Arm']

for i in range(3):
    for p in params:
        try:
            desc = p[1].split(' ')
            desc = [part.capitalize() for part in desc]
            desc = "".join(desc)
        except IndexError, e:
            print 'IndexError: %s' %(e,)
            continue
        print station[i],drive[i],p[0]
        flags_r.append( 'mod%(station)s_%(drive)sP%(param)04dr_%(desc)s' % \
                          { 'station' : station[i], 'drive' : drive[i], 'param': int(p[0]), 'desc':desc })
        flags_w.append( 'mod%(station)s_%(drive)sP%(param)04dw_%(desc)s' % \
                          { 'station' : station[i], 'drive' : drive[i], 'param': int(p[0]), 'desc':desc })
        numbers_r.append( 'mod%(station)s_%(drive)sP%(param)04drn_%(desc)s' % \
                          { 'station' : station[i], 'drive' : drive[i], 'param': int(p[0]), 'desc':desc })
        numbers_w.append( 'mod%(station)s_%(drive)sP%(param)04dwn_%(desc)s' % \
                          { 'station' : station[i], 'drive' : drive[i], 'param': int(p[0]), 'desc':desc })

    print i

params.csv:

100, Speed Reference
101, Speed Feedback

pour une raison quelconque, il est délivrer en sortie:

  

AC1 100
  AC1 101
  0
  1
  2

la raison de l'try / except est d'attraper des lignes vides ou deuxième champs manquants dans le fichier csv.

Il semble que la boucle intérieure ne s'exécuté sur la première passe. La seule raison pour laquelle je peux voir pour cela serait le try / except comme je l'ai fait un exemple interactif pour tester.

Était-ce utile?

La solution

Dans la première itération de la boucle externe que vous lisez toutes les lignes de params. Dans la deuxième itération toutes les lignes de params sont déjà lus, donc il n'y a rien à itérer dans la boucle intérieure.

Pour contourner ce problème, vous pouvez charger tous les ensembles de données dans une liste, puis itérer sur cette liste:

reader = csv.reader(open('params.csv'), delimiter=',', skipinitialspace=True)
params = list(reader)

Autres conseils

Assurez-vous que params est une liste et non un itérateur.

>>> s = (i for i in range(10))
>>> for ss in s: print(ss)

0
...
9
>>> for ss in s: print(ss)

# Nothing!

sur la première passe la mémoire tampon de lecture est épuisé, donc il n'y a rien d'autre à lire depuis que vous avez la fin du fichier.

Vous avez besoin de lire votre fichier avant les boucles

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top