“中断”不终止脚本python

时间:2019-06-11 02:25:37

标签: python

我正在尝试打开一个Excel文件,并根据名称(标题)获取各列。如果找不到这些标题,我希望脚本停止并显示一条消息,提示找不到该列。

我首先将当前编号分配给具有这些名称的列,然后在标题中搜索名称,以确保之间没有插入任何列,这会改变列编号。如果数字不同,它将使用名称所在的任何列号。

我一直试图在“ else”下放置“ elif”,并要求其打印错误,然后我将“ break”放置在其中。问题在于,如果没有找到列名,它不会停止脚本,而只是采用默认分配。我确实知道为什么这种中断不会停止整个脚本,但是我不知道如何将其停下来。该代码比这要复杂一些,但是我希望这能对您有所了解。

我也尝试删除默认分配,但随后它说找不到“ i”,因此给我一个错误。

我非常感谢您的帮助。

代码:

colTPNumber = 2
colTDNumber = 3

rows = sheet.iter_rows(min_row=1, max_row=1)
firstRow = next(rows)
for i in firstRow:
    if str(i.value) == "TP":
        colTPNumber = i.column
    elif str(i.value) == "TD":
        colTDNumber = i.column
    else:
        print ("Column name not found")
        break

3 个答案:

答案 0 :(得分:0)

尝试使用exit()代替breakbreak结束循环,但是exit()实际上退出了程序。

答案 1 :(得分:0)

break退出循环,而不是整个程序。

使用exit()sys.exit()(第二个选项请不要忘记import sys)退出程序

示例:

import sys #unnessary if you're using exit() only

colTPNumber = 2
colTDNumber = 3

rows = sheet.iter_rows(min_row=1, max_row=1)
firstRow = next(rows)
for i in firstRow:
    if str(i.value) == "TP":
        colTPNumber = i.column
    elif str(i.value) == "TD":
        colTDNumber = i.column
    else:
        print ("Column name not found")
        #break
        sys.exit()
        #OR
        exit()

更多信息:

您也可以使用quit()

  • quit()在幕后引发SystemExit异常。

此外,如果您打印它,它将显示一条消息:

>>> print (quit) 
Use quit() or Ctrl-Z plus Return to exit 

包含此功能是为了帮助不了解Python的人。毕竟,新手尝试退出Python的最可能的事情之一就是输入quit

尽管如此,quit不应在生产代码中使用。这是因为它仅在加载了网站模块后才有效。相反,此功能应仅在解释器中使用。

  • exit()是quit的别名(反之亦然)。它们在一起存在只是为了使Python更加用户友好。

此外,它在打印时也会发出一条消息:

>>> print (exit) 
Use exit() or Ctrl-Z plus Return to exit 

但是,像quit一样,exit被认为在生产代码中不好使用,应保留以供解释器使用。这是因为它也依赖于站点模块。

  • sys.exit在后​​台引发SystemExit异常。这意味着在这方面它与quitexit相同。

但是与这两个不同的是,sys.exit()被认为可以在生产代码中很好地使用。这是因为sys模块将一直存在。

  • os._exit退出程序而无需调用清理处理程序,刷新stdio缓冲区等。因此,这不是退出的标准方法,仅应在特殊情况下使用。其中最常见的是os.fork创建的子进程。

请注意,在给出的四种方法中,只有一种在其功能方面是独一无二的。

总结起来,所有四个方法都退出程序。但是,前两个在生产代码中被认为不好用,最后一个是非标准的,肮脏的方式,仅在特殊情况下使用。

因此,如果要正常退出程序,请使用第三种方法:sys.exit

或者,我认为更好的是,您可以直接在幕后进行sys.exit做的事情,然后运行:

raise SystemExit

这样,您无需先import sys

但是,这种选择只是一种选择,完全取决于您


改编自:https://www.edureka.co/community/16988/python-exit-commands-why-so-many-and-when-should-each-be-used


有关sys.exit()的更多信息:

sys.exit([arg])

从Python退出。这是通过引发SystemExit异常来实现的,因此可以遵循try语句的finally子句指定的清除操作,并且有可能在外部级别拦截出口尝试。

可选参数arg可以是给出退出状态的整数(默认为零),也可以是其他类型的对象。如果是整数,则shell等将零视为“成功终止”,而将任何非零值视为“异常终止”。大多数系统要求它的范围是0–127,否则会产生不确定的结果。某些系统具有为特定的退出代码分配特定含义的约定,但是这些通常不完善。 Unix程序通常将2用于命令行语法错误,将1用于所有其他类型的错误。如果传递了另一种类型的对象,则``无''等于传递零,并且将任何其他对象打印到stderr并导致退出代码为1.特别是,sys.exit("some error message")是退出的快速方法发生错误的程序。

由于exit()最终“仅”引发了异常,因此只有从主线程调用时,它才会退出进程,并且不会拦截该异常。

版本3.6中的更改:如果Python解释器捕获到SystemExit后清理过程中发生错误(例如错误清除标准流中的缓冲数据),则退出状态将更改为120。 >


来自https://docs.python.org/3/library/sys.html

答案 2 :(得分:0)

提供变量无效的默认值,以便您可以在循环后检查它们。

如果设置不正确,您可以调用exit(),这将终止整个脚本。

colTPNumber = None
colTDNumber = None

rows = sheet.iter_rows(min_row=1, max_row=1)
firstRow = next(rows)
for i in firstRow:
    if str(i.value) == "TP":
        colTPNumber = i.column
    elif str(i.value) == "TD":
        colTDNumber = i.column
if colTPNumber is None or colTDNumber is None:
    print("Column name not found")
    exit(1)

请参见Terminating a Python script