我有以下python代码,它可以正常工作,但是会带来错误,然后跳转到最后一行。
然后,我从文件中删除有问题的行,再次运行python脚本,但它再次找到有问题的行并跳到最后。
我希望能够打印所有行而无需跳转到python脚本的末尾(只需跳过行并继续到下一个):
import csv
with open('data.tsv', "rb") as f:
reader = csv.reader( f )
try:
for row in reader:
continue
except csv.Error, e:
print reader.line_num, e
pass
print "End of file!\n"
答案 0 :(得分:5)
手动迭代,希望csv阅读器对象可以从异常中恢复:
import csv
with open('data.tsv', "r") as f:
reader = csv.reader( f )
while True:
try:
row = next(reader)
print(row)
except csv.Error as e:
print("line: {}, error: {}".format(reader.line_num, e))
except StopIteration:
break
print("End of file!\n")
StopIteration
对象到达文件末尾时,将引发csv.reader
异常。此时,break
用于退出无限循环。
让我们通过在一行中插入一个NULL字节来进行测试。一种简单的方法是将f
替换为行列表:
data = """hello,world
foo,bar
hi\x00,I'm joe
recovered,yeah
"""
f = data.splitlines()
现在f
可以通过上面的代码馈送到csv.reader
(删除with
块)。注意在第三行插入的NUL字节。输出:
['hello', 'world']
['foo', 'bar']
line: 3, error: line contains NULL byte
['recovered', 'yeah']
End of file!
是的!它有效(并且代码与Python 2和Python 3兼容)作为奖励
答案 1 :(得分:-1)
将try
移动到for循环内
import csv
with open('data.tsv', "rb") as f:
reader = csv.reader( f )
for row in reader:
try:
continue
except csv.Error, e:
print reader.line_num, e
pass
print "End of file!\n"