我正在编写一个相当长的函数,该函数读取CSV文件并循环遍历各行,并检查它们是否符合预期格式,如果发现行格式不正确,则会引发异常。
对于期望格式的每一行,它会向控制台打印一条消息(使用打印功能),表明该行有效。否则将引发错误。
我希望看到的是一系列消息,说前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.
>>>
我想要的是首先打印消息,因为它们出现在代码中,而异常要在代码停止时最后打印,否则,它会在大量打印消息中丢失。它似乎仅用于循环(如果在循环之前打印某些内容,则会在异常之前打印出来)。谁能提供任何见解?
通过标准错误流而不是标准输出来打印异常。取决于终端,两个输出并不总是同步的。
您可以在打印后刷新输出:
print ("Valid letter, '" + letter + "' found. Keep going.",flush=True)
另一种选择是为消息写入标准错误,如果您打算将输出重定向到文件而不考虑消息,这不是一个坏主意
sys.stderr.write("Valid letter, '{}' found. Keep going.\n".format(letter))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句