2013-06-04 91 views
0

我遇到了一个问题“int()与基数10的无效文字:''”,这意味着python无法将“'转换为整数。但是我已经添加了一个条件if(sh.cell_value(rowx=rx, colx=3)!=''):,它可以跳过不包含任何内容的块。有没有人有一些想法?非常感谢你!int()与基数为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

如果您引用的错误消息是实际错误消息,则该字符串不为空。它包含一个空间。另外,即使你的if语句块没有执行,你仍然继续循环的其余部分,并尝试在's'上调用'int'。 – BrenBarn

+0

检查'如果string.strip()',这将删除与空格... –

+0

@BrenBarn除非发布后忍者编辑后,你的评论,我认为你误读。 ''''是空字符串 - 没有空格。 – sepp2k

回答

1

你如果块有压痕,因此逻辑问题。

修正版本:

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)) 
在您的版本

,只有一个语句就在于,如果块,等语句得到执行 即使有不正确的值:

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)) 

,因此,你的代码运行在空字符串或不包含数字的字符串上。

>>> 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

谢谢!我添加了一个if块:if(u!='') – Robert

0

这里是我建议你这样做。

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)) 

你并不需要从单元格值剥离空白,如果有什么,因为int()可以处理的空白。这将处理任何单元格值,''或其他任何内容。

我摆脱了filter()因为我担心它可能会做太多。例如,如果您有一个包含3.1415的单元格,则filter()调用会将该点去掉,您会得到31415,这似乎不是一个好主意。最好有一个错误,而不是错误地过滤。

相关问题