Ваш код делает это намного сложнее, чем нужно.
Во-первых, вы почти наверняка не хотите заключать весь этот блок кода в обработчик исключений catch all.Вы хотите, чтобы ваша обработка исключений была достаточно конкретной (ограниченной), чтобы вы могли сделать что-то значимое с исключением.Например:
#!python
# Assumes Python version 3 or later
import sys, csv
filename='myfile.csv'
with open(filename as f:
try:
reader = csv.reader(f)
for record in reader:
if len(record) != 2:
# log error and continue
print('Malformed records in {}: {}'.format(filename, reader.line_num), file=sys.stderr)
continue
# do stuff with this record, knowing it has exactly two fields:
fname = record[0]
lname = record[1]
# etc ...
except csv.Error as e:
print('Error handling {} at line {}: {}'.format(filename, reader.line_num, e), file=sys.stderr)
Обратите внимание, что ваши ошибки, вероятно, были не только в модуле csv
.Это довольно терпимо к искаженным линиям.Но я показываю, как обернуть читателя и обработать код в обработке исключений только для этого.Ваша ошибка, вероятно, была IndexError
(при попытке получить доступ к элементу после количества элементов в списке ... вне его допустимого диапазона индексации. Лучше просто проверить длину каждой записи, чемиспользуйте для этого обработку исключений ... хотя это возможно в любом случае.
В документации для стандартных библиотек есть довольно разумный пример (очень похожий код): https://docs.python.org/3/library/csv.html
Кроме того, стилистическиЯ бы предложил именованный кортеж или облегченный класс (использующий __slots__
) для управления этими записями. Это позволит вам использовать точечную запись для доступа к .fname
и .lname
каждой записи вместо использования [x]
и числовое индексирование. (Числовое индексирование становится все более громоздким и подверженным ошибкам по мере увеличения сложности кода).