我正在编写一个相当冗长的函数,它读取 CSV 文件并循环遍历行并检查它们是否具有预期的格式,如果发现不符合预期的格式,则会引发异常。
对于具有预期格式的每一行,它都会向控制台打印一条消息(使用 print 函数),说明该行有效。否则会引发错误。
我期望看到的是一系列消息,说明前 X 行有效,如果遇到错误,则后面会出现异常,但它会打印异常,然后打印消息,尽管事实上它们是从之前的迭代中调用的循环的。
谁能解释为什么会这样,因为我无法理解它?
以我创建的这个简短的基本示例为例:
letters = ['a','b','c']
for letter in letters:
if letter == 'a' or letter == 'c':
print ("Valid letter, '" + letter + "' found. Keep going.")
else:
raise Exception("Invalid letter, '" + letter + "' found. Break program.")
它产生以下输出:
>>> >>> ... ... ... ... ... Traceback (most recent call last):
File "<stdin>", line 5, in <module>
Exception: Invalid letter, 'b' found. Break program.
Valid letter, 'a' found. Keep going.
>>>
我想要的是首先打印消息,就像它们出现在代码中一样,并在代码停止时最后打印异常,否则它会在大量打印消息中丢失。它似乎只是 for 循环(因为如果我在循环之前打印一些内容,它就会在异常之前打印)。任何人都可以提供任何见解吗?
通过标准打印异常error流,而不是标准输出。根据终端的不同,两个输出并不总是同步的。
您可以在打印后刷新输出:
print ("Valid letter, '" + letter + "' found. Keep going.",flush=True)
另一种选择是写入消息的标准错误,如果您打算将输出重定向到文件而忽略消息,那么这不是一个坏主意
sys.stderr.write("Valid letter, '{}' found. Keep going.\n".format(letter))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)