2013-06-04 5 views
0

J'ai rencontré un problème "littéral invalide pour int() avec base 10: ''", ce qui signifie que python ne peut pas convertir '' en entiers. Mais j'ai déjà ajouté une condition if(sh.cell_value(rowx=rx, colx=3)!=''):, qui pourrait sauter les blocs qui ne contient rien dans l'excel. Est-ce que quelqu'un a une idée? Merci beaucoup!littéral invalide pour int() avec base 10: ''

import xlrd 
book = xlrd.open_workbook("streeteasy.xls") 
sh = book.sheet_by_index(0) 
total = 0 

for rx in range (sh.nrows): 
    if(sh.cell_value(rowx=rx, colx=3)!=''): 
     s = sh.cell_value(rowx=rx, colx=3) 
     print filter(unicode.isdigit, s) 
     print int(filter(unicode.isdigit, s)) 
     total += int(filter(unicode.isdigit, s)) 
+1

Si le message d'erreur que vous citez est le message d'erreur réel, la chaîne n'est pas vide. Il contient un espace. De plus, même si votre bloc 'if' ne s'exécute pas, vous continuez le reste de la boucle et essayez d'appeler' int' sur 's'. – BrenBarn

+0

cochez 'si string.strip()', ce qui supprimera les espaces withe ... –

+0

@BrenBarn A moins que le post ait été édité par ninja après votre commentaire, je pense que vous avez mal lu. '' '' est la chaîne vide - pas d'espace. – sepp2k

Répondre

1

Votre bloc if a une indentation, d'où un problème logique.

Version corrigée:

for rx in range (sh.nrows): 
    if(sh.cell_value(rowx=rx, colx=3)!=''): 
     s = sh.cell_value(rowx=rx, colx=3) 
     print filter(unicode.isdigit, s) 
     print int(filter(unicode.isdigit, s)) 
     total += int(filter(unicode.isdigit, s)) 

dans votre version, une seule déclaration se trouve dans le cas bloc, et d'autres déclarations s'exécuter même avec des valeurs incorrectes:

for rx in range (sh.nrows): 
    if(sh.cell_value(rowx=rx, colx=3)!=''): 
     s = sh.cell_value(rowx=rx, colx=3) 
    print filter(unicode.isdigit, s) # THIS IS NOT INSIDE IF 
    print int(filter(unicode.isdigit, s)) 
    total += int(filter(unicode.isdigit, s)) 

Et par conséquent, votre code s'exécute sur une chaîne vide ou une chaîne ne contenant aucun chiffre.

>>> s = u"  " 
>>> 
>>> 
>>> filter(unicode.isdigit, s) 
u'' 
>>> int(filter(unicode.isdigit, s)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: '' 
+0

Merci! J'ai ajouté un bloc if: if (u! = '') – Robert

0

Voici comment je vous suggère de le faire.

for rx in range (sh.nrows): 
    try: 
     s = sh.cell_value(rowx=rx, colx=3) 
     total += int(s) 
    except ValueError: 
     if DEBUG_FLAG: 
      debug_print("problem: (%d, %d) is '%s'" % (rx, 3, s)) 

Vous n'avez pas besoin de dépouiller l'espace blanc de la valeur de la cellule, s'il y en a, parce que int() peut gérer l'espace blanc. Cela gérera n'importe quelle valeur de cellule, '' ou toute autre chose.

Je me suis débarrassé du filter() parce que je crains que ça en fasse trop. Par exemple, si vous avez une cellule contenant 3.1415, l'appel filter() supprimera le point, et vous obtiendrez 31415 ce qui ne semble pas être une bonne idée. Mieux vaut avoir une erreur que de filtrer incorrectement.

Questions connexes