2010-06-04 60 views
2

Est-ce que quelqu'un connaît un analyseur syntaxique chaîne-à-flotteur python qui peut gérer les nombres nanométriques MSVC (1. # QNAN)? Actuellement, je suis en train d'utiliser float(str) qui fait au moins face à "nan". J'utilise un script python pour lire la sortie d'un programme C++ (fonctionne sous linux/mac/win plates-formes) et le script remonte lors de la lecture de ces valeurs. (J'ai déjà trouvé une bibliothèque C++ pour afficher les valeurs de manière cohérente sur toutes les plates-formes, mais il faut parfois comparer les résultats passés, donc cela apparaît parfois.)lecture des nombres à virgule flottante avec 1. # valeurs QNAN dans python

Répondre

2

Comme vous devez gérer des fichiers de sortie hérités, je ne vois aucun autre possibilité, mais écrire une fonction robust_float:

def robust_float(s): 
    try: 
     return float(s) 
    except ValueError: 
     if 'nan' in s.lower(): 
      return float('nan') 
     else: 
      raise 
+0

Eh bien voici une drôle, mon python (2,5 sur la victoire) ne supporte pas float (« nan »), mais quand je l'ai essayé sur linux (2.4), il a travaillé. Semble que cela dépend de la bibliothèque C comme mentionné dans l'aide: 'Remarque: Lors du passage dans une chaîne, les valeurs de NaN et Infinity peuvent être retournées, en fonction de la bibliothèque C sous-jacente. L'ensemble spécifique de chaînes acceptées qui provoquent le retour de ces valeurs dépend entièrement de la bibliothèque C et est connu pour varier. » –

+0

Merci, cela fonctionne. En ce qui concerne le commentaire d'EnTerr, je pense que le moyen le plus simple de le rendre portable est de remplacer 'float ('nan')' par quelque chose comme '1e1000-1e1000'. – dhardy

+0

float ('nan') est portable sur toutes les plateformes commençant par 2.6. Voir http://docs.python.org/whatsnew/2.6.html – krawyoti