Проблема возникла в этом question, который я повторю в этом коде:
import csv
FH = open('data.csv','wb')
line1 = [97,44,98,44,99,10]
line2 = [100,44,101,44,102,10]
for n in line1 + line2:
FH.write(chr(n))
FH.write(chr(0))
FH.close()
import _csv
FH = open('data.csv')
reader = csv.reader(FH)
for line in reader:
if '\0' in line: continue
if not line: continue
try:
print line
except _csv.Error:
print 'error'
Запустите его:
$ python test.py
['a', 'b', 'c']
['d', 'e', 'f']
Traceback (most recent call last):
File "test.py", line 14, in <module>
for line in reader:
_csv.Error: line contains NULL byte
Итак, я предполагаю, что включение NUL в файл вызывает "неуловимое" исключение.
Вопрос в том, что, прежде всего, сначала продезинфицировать файл, какой лучший способ справиться с этим? Насколько распространены "неуловимые" исключения?
Вы не помещаете блок "try" в нужное место, чтобы поймать это исключение. Другими словами, это исключение является "захватывающим", просто перейдите к вопросу, на который вы ссылались.
В трассировке четко указано, что проблема находится в строке с инструкцией "для".
Это не сложно, вы просто пытаетесь поймать его не в том месте. Ошибка возникает в строке:
for line in reader:
и вы помещаете блок try вокруг:
print line
Исключение уже было поднято на этом этапе.
Вы можете обернуть весь блок, как показано в других ответах, или изолировать исключение, деформируя цикл, чтобы вручную манипулировать итерацией вашего считывателя csv:
while 1:
try:
line = f.next()
except StopIteration:
break
except csv.Error:
print "Error occurred"
process_line(line)
Это ущемляет читаемость в пользу ограничения обработки исключений на соответствующий бит кода. Вероятно, излишнее исключение, такое как csv.error, но это удобный метод при попытке изолировать, например, IOError.
Попробуйте следующее:
FH = open('data.csv')
try:
reader = csv.reader(FH)
for line in reader:
if '\0' in line: continue
if not line: continue
print line
except _csv.Error:
print 'error'
Код, который бросает исключение, находится не внутри try/except.
Traceback (most recent call last):
File "test.py", line 14, in <module>
for line in reader:
Так же, как показывает трассировка, получение следующей строки от читателя является причиной исключения. Вам нужно, чтобы весь for
попытался.