2016-07-08 1 views
1

J'essaye d'analyser un fichier, dans lequel il y a toujours une partie, et la partie précédente est optionnelle.Quitter gracieusement à EOF

for line in finp: 
    # This part is always present 
    for _ in range(int(ldata[2])): 
     sdata = finp.readline() 
     tdos.write(sdata) 


    #This part may or may not be present 
    for i in range(int(atoms)): 
     next(finp) 
     for j in range(int(ldata[2])): 
      aatom[i][j] = [float(x) for x in 
          finp.readline().strip().split()] 

Le problème est, si la partie optionnelle n'est pas présent, next(finp) donne erreur:

next(finp) 
StopIteration 

J'ai essayé avec:

for i in range(int(atoms)): 
    if i is not None: 
     next(finp) 
     for j in range(int(ldata[2])): 
      aatom[i][j] = [float(x) for x in 
          finp.readline().strip().split()] 
    else: 
     break 

Mais cela ne résout pas le problème . J'ai trouvé beaucoup de questions précédentes avec la même question comme this, mais incapable de résoudre ce problème.

Est-ce que le seul moyen de le résoudre est de lire tout le fichier et de le traiter?

Répondre

4

Donnez next() une valeur par défaut pour retourner:

next(finp, None) 

Lorsqu'on leur donne un second argument, next() sera prise une exception StopIteration et retourner ce second argument à la place.

L'alternative est d'attraper le StopIteration vous-même; peut-être que vous voulez sortir de la boucle à ce moment:

try: 
    next(finp) 
except StopIteration: 
    break 

Notez que vous mixez aussi file.readline() et next(file). En raison des détails de mise en œuvre dans Python 2, vous allez rencontrer un comportement inattendu car ces deux méthodes ne partagent pas leur cache et non. S'en tenir à utiliser next() ici (comme la boucle for traite également file comme un itérateur). Voir la documentation de la File Objects:

In order to make a for loop the most efficient way of looping over the lines of a file (a very common operation), the next() method uses a hidden read-ahead buffer. As a consequence of using a read-ahead buffer, combining next() with other file methods (like readline()) does not work right. However, using seek() to reposition the file to an absolute position will flush the read-ahead buffer.

Si vous utilisez Python 3, vous pouvez ignorer cet avertissement, mais vous seriez encore mieux coller à l'aide de l'une des deux approches.