Django - CSV Reader не работает, если CSV-файл содержит пустую строку - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть функция в представлении, которое я использую для загрузки данных CSV и записи в БД.Функция работает правильно, если в файле CSV нет пустых строк.Однако, если в файле CSV есть пустые строки, функция вообще не читает никаких данных.Ниже приведен фрагмент кода:

data_set = csv_file.read().decode('utf-8')
io_string = io.StringIO(data_set)
next(io_string)
created = None
created_records = 0
for column in csv.reader(io_string, delimiter=',', quotechar="|"):
    _, created = GrowerMaster.objects.update_or_create(
        grower_no           =column[0],
        surname             =column[1],
        name                =column[2],
        initials            =column[3],
        area                =column[11],
        national_id         =column[15],
        contractor          =column[21]
    )

    if created:
        created_records+=1


if created is None:
    messages.warning(request, "No records were read from file. Please check the file and try again")

if created_records > 0:
    messages.success(request, f"{created_records} new records have been imported successfully")

else:
    messages.warning(request, "No new records were imported.")  

Где и как можно решить эту проблему, чтобы файл CSV с пустой строкой все еще можно было успешно обработать.

На снимке экрана ниже показанолиния, которая вызывает проблему.Если я удалю эту строку вручную, файл успешно загрузится.

enter image description here

1 Ответ

0 голосов
/ 26 сентября 2019

убедитесь, что у него есть количество столбцов, необходимых перед анализом строки.В противном случае вы будете пытаться получить доступ к столбцам, которые не существуют, и закончится сбоем.

for column in csv.reader(io_string, delimiter=',', quotechar="|"):
    if len(column) >= HEADER_LENGTH:
        _, created = GrowerMaster.objects.update_or_create(
            grower_no           =column[0],
            surname             =column[1],
            name                =column[2],
            initials            =column[3],
            area                =column[11],
            national_id         =column[15],
            contractor          =column[21]
        )

В качестве альтернативы попробуйте обработать исключение (которое, вероятно, будет IndexError):

for column in csv.reader(io_string, delimiter=',', quotechar="|"):
    try:
        _, created = GrowerMaster.objects.update_or_create(
            grower_no           =column[0],
            surname             =column[1],
            name                =column[2],
            initials            =column[3],
            area                =column[11],
            national_id         =column[15],
            contractor          =column[21]
        )
        if created:
            created_records+=1
    except IndexError:
        # skip the row
        pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...