【问题标题】:Python: ValueError: invalid literal for int() with base 10: '' error [closed]Python:ValueError:以10为底的int()的无效文字:''错误[关闭]
【发布时间】:2013-05-14 06:29:20
【问题描述】:

我有一个代码可以从文件中读取信息(行描述点、多边形、线和圆)并将其解析为相应的类。 Point 有 x 和 7 坐标,Line 有起点和终点。

我有一个列表 (line = ['L1','L((1,1), (1,2))','# comment']),我试着把它排成一行。问题在于创建端点,执行时出现以下错误ValueError: invalid literal for int() with base 10: '' fr the variable x2

有什么问题?

代码:

def make_line(line):
        name = line[0]
        point = line[1].split(", ")
        p = point[0].split(",")
        x1 = int(p[0][3:])
        y1 = int(p[1][:-1])
        point1 = Point(x1,y1)
        p = point[1].split(",")
        x2 = int(p[0][1:])
        y2 = int(p[1][:-2])
        point2 = Point(x2,y2)
        line = Line(point1,point2)
        shapes[name] = line

【问题讨论】:

  • 尝试打印出p[0][1:],看看它是否是您认为的那样。我的猜测是,你会感到惊讶。
  • 这些是标准库的一部分吗?我可以从哪个模块获得PointLine
  • 恰恰相反!它会打印出1,但是当投射int() 时,就会发生错误。 @mrKelley,那些是自写的课程
  • 您的输入中有一些大写的Ls - 小写的l 是否可能已经潜入其中,这就是您所看到的数字1?跨度>
  • 当我删除创建 PointLine 对象的不相关行时,您的代码适用于我的示例输入。 x2 被赋值为 1。

标签: python list int


【解决方案1】:

您的错误消息说您正在尝试将空字符串转换为 int。在进行转换之前立即仔细检查所有数据以验证这一点。

绝对可以肯定,如果数据正确,则转换为整数将起作用。因此,唯一可以得出的结论是您的数据不正确。您在 cmets 中声称数据是好的,但这根本不是真的。

相信 Python 解释器而不是你自己的假设。

【讨论】:

  • 我重新检查了所有内容,但找不到错误,所以我继续测试我的代码,但避免了错误的功能。提供给函数的行是从文件中读取的。在某些时候,我把那行放在文件的末尾而不是文件的中间,这样就可以了。 “神奇的神秘错误修复”就在那里
【解决方案2】:

我删除了您没有提供足够信息的部分,但我仍然没有收到同样的错误。

def make_line(line):
    name = line[0]
    point = line[1].split(", ")
    p = point[0].split(",")
    x1 = int(p[0][3:])
    y1 = int(p[1][:-1])
    p = point[1].split(",")
    x2 = int(p[0][1:])
    y2 = int(p[1][:-2])
    return x1, y1, x2, y2

>>> make_line(['L1','L((1,2), (1,1))','# comment'])
(1, 2, 1, 1)

【讨论】:

    【解决方案3】:

    错误表明您的代码有问题,但实际上它运行正确。 如果您遇到错误,值得找到它们发生的行,并使用print 打印它们的值,以确保您将正确的值传递给正确的方法。

    处理这种(乍一看)有趣的格式的简单方法是使用 python 的eval() 函数。您会注意到列表的第二部分看起来很像一组两个集合,实际上确实如此。

    如果你这样做,你会得到一个很好的集合对象:

    eval("((1,1), (1,2))")
    # equivalent to this:
    eval(line[1][1:],{}) # passing an empty dict as the 2nd argument makes eval a (bit) safer
    

    但这只是一种快速而肮脏的方法,绝不应该在生产代码中使用。

    【讨论】:

    • 贴出的代码实际上给出了正确的结果,所以你的答案一定是错误的。并且推荐 eval 进行解析是可怕的建议。
    • 我知道eval() 不是很好的做法,但我展示了一种快速简便的使用方法。你说得对,我应该更清楚地说明它的缺点。更新了帖子
    猜你喜欢
    • 2015-10-15
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多