Python 3.x 尝试拆分值时如何解释意外数据

Python 3.x 尝试拆分值时如何解释意外数据,python-3.x,Python 3.x,我有以下代码片段,它是从链接中提取图像文件名的较大代码块的一部分 for a in soup.find_all('a', href=True): url = a['href'] path, file = url.rsplit('/', 1) name, ext = file.rsplit('.', 1) 它工作得很好,但是有时数据(来自外部源)会有错误 具体来说,上面代码段的最后一行将抛出一个错误:

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

        for a in soup.find_all('a', href=True):
            url = a['href']
            path, file = url.rsplit('/', 1)
            name, ext = file.rsplit('.', 1)
它工作得很好,但是有时数据(来自外部源)会有错误

具体来说,上面代码段的最后一行将抛出一个错误:

    name, ext = file.rsplit('.', 1)
ValueError: not enough values to unpack (expected 2, got 1)
忽略此错误(或包含不符合预期的输入的行)并继续下一个条目的最佳方式是什么

我本以为try-and-catch是正确的方法,但在谷歌搜索如何处理此类错误时,我没有发现任何东西


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

在这种情况下,我不会使用try-except,因为您不需要except部分。如果遇到错误,您将不会处理该文件。请随意阅读try excepts,stack overflow上有很多关于它的问题,看看您认为什么最适合您

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

file = 'babadabooey'
print(file.rsplit('.', 1))
出局:['babadabooey']

因此,如果您试图将其解压为两个值,您将得到一个错误。我想,大多数时候你都在期待类似的事情

file = 'babadabooey.exe'
print(file.rsplit('.', 1))
输出:['babadabooey','.exe']

因此,如果您尝试将该值解压为两个值,就可以了。我将如何继续使用if语句,这样,只有在文件var中有“.”时才尝试拆分它

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

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

['a.b.c'、'a.b'、'a'、'a.b.c'中的项目的
:
尝试:
路径,文件=item.rsplit('.',1)
打印(“%s,%s”%(路径,文件))
除值错误外:
打印(“错误与%s”%item)
持续
打印(“更多工作在这里!”)
它给出了输出:

a.b, c more work here! a, b more work here! error with a a.b, c more work here! a、 b,c 这里有更多的工作! a、 b 这里有更多的工作! 错误 a、 b,c 这里有更多的工作! 当然,这可能不是最好的解决方案,这取决于您尝试做什么的更大背景。忽略没有扩展名的文件安全吗


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

为什么try块几乎从不被推荐?我觉得很有效。我理解错误只是不知道如何处理它…如果我得到一个像“babadabooey”这样的值,我只想完全忽略/跳过它,继续前进。使用if块时,它不会被分割,但仍会被处理,对吗?如果使用try块,它将被跳过?我将编辑答案以更清楚地了解try except。你把它倒过来了。使用if语句,它将被完全跳过,使用try-except,它将执行您的代码,意识到它不起作用,然后执行except语句中的所有操作。您可以根据需要将“continue”关键字添加到else或except语句中。当然,在这种情况下,如果“.”字符确实存在,则实际上是在“file”中扫描两次。大概是有一个。这是一种常见的情况,因此您正在极大地增加正在进行的扫描量。(更多信息)。@robsiemb是的,这完全取决于他们希望输入的数据以及出现/不会出现“.”的频率。谢谢你的回答,但我认为在我所做的更大范围内,我需要使用try and Exception块。谢谢你的回答!如果你想尝试,这绝对是正确的答案。谢谢,这是一种享受,我应该意识到这是多么简单,我知道怎么做,但出于某种原因没有尝试…,在尝试时仍然学会自信。