выполнить итерацию вручную, надеясь, что объект чтения 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 в качестве бонуса)