【问题标题】:How to account for unexpected data when trying to split values尝试拆分值时如何考虑意外数据
【发布时间】:2020-02-09 10:34:31
【问题描述】:

我有以下代码 sn-p,它是从链接中提取图像文件名的较大代码块的一部分。

        for a in soup.find_all('a', href=True):
            url = a['href']
            path, file = url.rsplit('/', 1)
            name, ext = file.rsplit('.', 1)

它工作得很好,但是有时数据(来自外部来源)会出现错误。

具体来说,上面sn-p的最后一行会抛出一个错误:

    name, ext = file.rsplit('.', 1)
ValueError: not enough values to unpack (expected 2, got 1)

忽略此错误(或包含不符合预期的输入的行)并继续下一个条目的最佳方法是什么?

我认为 try and catch 是正确的方法,但是在谷歌上搜索如何处理这种类型的错误时,我没有找到任何东西。

是否可以使用 try 块来捕获此类错误?如果不是,为什么不呢?更好的方法是什么?

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    假设您只需要忽略错误,这种 try/except 样式应该适合您:

    for item in ['a.b.c', 'a.b', 'a', 'a.b.c']:
      try:
        path, file = item.rsplit('.',1)
        print("%s, %s" % (path, file))
      except ValueError:
        print("error with %s" % item)
        continue
      print("more work here!")
    

    给出输出:

    a.b, c 更多工作在这里! 一,乙 更多工作在这里! 错误 a.b, c 更多工作在这里!

    当然,这可能不是最好的解决方案,具体取决于您尝试做的事情的更大背景。忽略没有扩展名的文件是否安全?

    特别是,您通常应该在处理传入数据之前尽可能多地对其进行清理,尽管这是一个相对微不足道的示例,并且为此清理数据可能与执行此特定拆分一样昂贵。换句话说,用户输入脏并不是真正的“异常”情况。

    【讨论】:

    • 如果你想使用 try-except 这绝对是正确的答案
    • 谢谢你,这是一种享受,我应该意识到这是多么简单,因为它是如此明显,我知道该怎么做,但由于某种原因没有尝试...... ., 在尝试事情时仍然要学会自信。
    【解决方案2】:

    在这种情况下,我不会使用 try-except,因为您没有使用 except 部分。如果您确实遇到错误,您将不会处理该文件。随意阅读 try-excepts,关于堆栈溢出有很多关于它的问题,看看你认为什么最适合你。

    听起来你不明白这个错误。该错误是因为您必须有一个没有扩展名的文件名。所以当你做 rsplit 时,它只有 1 个值。例如:

    file = 'babadabooey'
    print(file.rsplit('.', 1))
    

    输出:['babadabooey']

    因此,如果您尝试将其解压缩为两个值,则会出现错误。我想,大多数时候你都在期待类似的东西

    file = 'babadabooey.exe'
    print(file.rsplit('.', 1))
    

    输出:['babadabooey', '.exe']

    因此,如果您尝试将该值解压缩为两个值,那就没问题了。我将如何继续使用 if 语句,这样您只尝试将其拆分为 IF '。在文件 var 中。

    if '.' in file:
        name, ext = file.rsplit('.', 1)
    

    【讨论】:

    • 为什么几乎从不推荐 try 块?我觉得相当有效。我理解错误只是不知道如何处理它......如果我得到一个像'babadabooey'这样的值,我只想完全忽略/跳过它并继续前进。使用 if 块,它不会被拆分,但仍会被处理,对吗?与 try 块一样,它会被跳过吗?
    • 我将编辑答案以更清楚地了解 try-except。你倒过来了。使用 if 语句,它将被完全跳过,使用 try-except,它将执行您的代码,意识到它不起作用,然后执行您在 except 语句中所做的任何事情。您可以根据需要将“continue”关键字添加到 else 或 except 语句。
    • 当然,在这种情况下,您实际上是在“文件”中扫描“。”如果它确实存在,则字符两次。大概是有的情况。是一种常见情况,因此您正在大大增加您正在进行的扫描量。 (更多关于runtime of the in operator)。
    • @robsiemb 是的,这绝对取决于他们期望作为输入的数据以及会有/不会出现“。”的频率。
    • 感谢您的回答,但我认为在我所做的更大范围内,我需要使用 try 和 except 块。不过还是谢谢你的回答!
    猜你喜欢
    • 2017-10-06
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2021-01-19
    相关资源
    最近更新 更多