基数为 10 的 int() 的无效文字:''

Posted

技术标签:

【中文标题】基数为 10 的 int() 的无效文字:\'\'【英文标题】:invalid literal for int() with base 10: ''基数为 10 的 int() 的无效文字:'' 【发布时间】:2013-05-31 06:19:28 【问题描述】:

我遇到了一个问题“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))

【问题讨论】:

如果您引用的错误消息是实际错误消息,则字符串不为空。它包含一个空格。此外,即使您的 if 块没有执行,您仍然会继续循环的其余部分并尝试在 s 上调用 int 检查if string.strip(),这将删除空格... @BrenBarn 除非帖子在您发表评论后得到忍者编辑,否则我认为您误读了。 '' 是空字符串 - 没有空格。 @sgpc 我添加了 .strip() 之类的:print int(filter(unicode.isdigit, s.strip())),但还是不行…… 【参考方案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: ''

【讨论】:

谢谢!我添加了一个 if 块:if(u!='')【参考方案2】:

我建议你这样做。

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,这似乎不是一个好主意。出错总比过滤不正确好。

【讨论】:

以上是关于基数为 10 的 int() 的无效文字:''的主要内容,如果未能解决你的问题,请参考以下文章

Django - ValueError: int() 以 10 为基数的无效文字:''

django ValueError:以 10 为基数的 int() 的无效文字:''

拆分文本时出现“ValueError:int() 的无效文字,基数为 10:''”

Django - 基数为 10 的 int() 的 Formset 无效文字:''

ValueError: int() 以 10 为基数的无效文字:'' 使用 tkinter

Python数据错误:ValueError:int()的无效文字,基数为10:'42152129.0'