Чтение случайных столбцов из CSV-файла: Django - PullRequest
0 голосов
/ 09 апреля 2020

Из файла CSV я хочу прочитать только 3 столбца:

{Id, name, approve}

Но когда пользователь загружает файл CSV, он может получить дополнительную информацию в случайном порядке, например:

{approve, reject, Id, foreign, name, approve, description}

До сих пор мне удавалось сопоставлять только при наличии «разрешенных заголовков» в загруженном csv (код ниже работает).

Но как я могу прочитать данные из этих » столбцы разрешенных заголовков (учитывая, что их индексная позиция может быть в произвольном порядке)?

Мой код (forms.py)

def clean(self):       
        uploaded_csv_file = self.cleaned_data['csv_file']
        allowed_headers = {'id','name','approve'}
        validation_errors = []

        if uploaded_csv_file:
            filename = uploaded_csv_file.name
            if not filename.endswith(settings.FILE_UPLOAD_TYPE):
                raise forms.ValidationError("Please upload .csv extension files only")

            # django InMemoryUploadedFile returns bytes and we need strings
        rows = csv.reader(StringIO(uploaded_csv_file.read().decode('utf-8')))
        header = next(rows)

        csv_fields = set(header)
        csv_fields = {field.lower() for field in csv_fields}
        result =  all(elem in allowed_headers  for elem in csv_fields) # Check if list1 contains all elements of list2 using all()

        if not result:
            validation_errors.append(
                ValidationError('Your file could not be processed. You should provide %s columns in the file' % ', '.join(allowed_headers)))

Заранее спасибо:)

1 Ответ

1 голос
/ 09 апреля 2020

Похоже, вы можете использовать csv.DictReader и получить доступ к каждому столбцу по имени, например:

allowed_headers = {'id','name','approve'}
# ...
csvin = csv.DictReader(StringIO(uploaded_csv_file.read().decode('utf-8')))
# lowercase all fieldnames before doing anything else
csvin.fieldnames = [name.lower() for name in csvin.fieldnames]
if not allowed_headers.issubset(csvin.fieldnames):
    # ... required fields aren't present

for row in csvin:
    name = row['name'] # ... etc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...