0

我遇到了一个问题“invalid literal for int() with base 10: ''”,这意味着 python 无法将 '' 转换为整数。但是我已经添加了一个条件if(sh.cell_value(rowx=rx, colx=3)!=''):,它可以跳过excel中不包含任何内容的块。有人有什么想法吗?非常感谢!

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

2 回答 2

1

您的 if 块有缩进,因此存在逻辑问题。

更正版本:

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

在您的版本中,只有一条语句位于 if 块中,即使使用不正确的值也会执行其他语句:

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: ''
于 2013-06-04T18:27:37.503 回答
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这似乎不是一个好主意。出错总比过滤不正确好。

于 2013-06-04T20:04:45.947 回答