Перебирайте и проверяйте большие загруженные файлы CSV в Django - PullRequest
0 голосов
/ 20 сентября 2018

Я использую модуль Django django-chunked-upload для получения потенциально больших файлов CSV.Я могу предположить, что CSV правильно отформатированы, но я не могу предположить, что такое разделитель.

После завершения загрузки возвращается объект UploadedFile .Мне нужно проверить, что правильные столбцы включены в загруженный CSV и что типы данных в каждом столбце правильные.

загрузка файла с csv.reader() не работает:

reader = csv.reader(uploaded_file)
next(reader)
>>> _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

Это может быть связано с тем, что uploaded_file.content_type и uploaded_file.charset оба выглядят как None.

Я нашел довольно не элегантное решение, чтобы захватить заголовок и выполнить итерации по строкам:

i = 0
header = ""
for line in uploaded_file:
    if i == 0:
        header = line.decode('utf-8')
        header_list = list(csv.reader(StringIO(header)))
        print(header_list[0])
        #validate column names
    else:
        tiny_csv = StringIO(header + line.decode('utf-8'))
        reader = csv.DictReader(tiny_csv)
        print(next(reader))
        #validate column types

Я также пытался загрузить путь к сохраненному файлу:

path = #figure out the path of the temp file
f = open(path,"r")
reader = csv.reader(f)

Но мне не удалось получить путь к временному файлу из объекта UploadedFile.

В идеале я хотел бы создать обычного читателя или DictReader из объекта UploadedFile, но, похоже, он ускользает от меня.У кого-нибудь есть идеи?- Спасибо

1 Ответ

0 голосов
/ 25 сентября 2018

Ответ находится в chunked_upload / models.py со строкой:

def get_uploaded_file(self):
    self.file.close()
    self.file.open(mode='rb')  # mode = read+binary
    return UploadedFile(file=self.file, name=self.filename,
                        size=self.offset)

Так что, когда вы создаете свою файловую модель, вы можете открыть файл с помощью mode='r' вместо:

#myapp/models.py

from django.db import models
from chunked_upload.models import ChunkedUpload
from django.core.files.uploadedfile import UploadedFile
class FileUpload(ChunkedUpload):
    def get_uploaded_file(self):
        self.file.close()
        self.file.open(mode='r')  # mode = read+binary
        return UploadedFile(file=self.file, name=self.filename,
                            size=self.offset)

Это позволяет вам взять возвращенный экземпляр UploadedFile и проанализировать его как csv:

def on_completion(self, uploaded_file, request):
    reader = csv.reader(uploaded_file)
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...