Python 使用xlrd读取django批量excel文件太慢

Python 使用xlrd读取django批量excel文件太慢,python,django,excel,xlrd,Python,Django,Excel,Xlrd,我正在django模型中加载excel文件,并使用xlrd读取它并存储在数据库中。 加载大约20k行需要1分钟。但是我的文件有160k行,大约需要8分钟,所以对于这种大容量文件,我需要将读取和存储时间减少到不到1分钟。我应该做些什么来减少加载时间。所有可能的方法是什么 def upload_file(request): if request.method == 'POST': form = UploadFileForm(request.POST, request.FILE

我正在django模型中加载excel文件,并使用xlrd读取它并存储在数据库中。 加载大约20k行需要1分钟。但是我的文件有160k行,大约需要8分钟,所以对于这种大容量文件,我需要将读取和存储时间减少到不到1分钟。我应该做些什么来减少加载时间。所有可能的方法是什么

def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            newdoc = Upload(file = request.FILES['file'])
            newdoc.save()
            xlbook = open_workbook(newdoc.file.name)
            sheet = xlbook.sheet_by_index(0)
            field = [sheet.cell_value(0,c) for c in range(sheet.ncols)]
            temp = [sheet.cell_value(c,0) for c in range(sheet.nrows)]
            value = [[sheet.cell_value(r,c) for c in range(sheet.ncols)]for r in range (sheet.nrows)]
            data = {}
            if request.POST.get('check'):       
                Sales.objects.filter(OrderID__in = temp[1:]).delete()
            for n in range(0,sheet.nrows):
                if n > 0:
                    list = value[n]
                    for i in range(0,len(field)):
                        data[field[i]] = list[i]
                if data:
                    date_value = xldate_as_tuple(sheet.cell_value(n,1),xlbook.datemode)
                    data["Date"] = datetime(*date_value[:3])
                    add = Sales.objects.get_or_create(**data)
            return HttpResponseRedirect('/salesdata/')
    if request.method == 'GET':
       form = UploadFileForm(request.POST, request.FILES) 
    return render(request,'salesdata/upload.html', {'form': form})
第一,不要在视图中这样做。用芹菜之类的东西开始一个后台任务,然后返回。不要让用户等待

第二,问题是你正在为每一行做一个
get\u或\u create
;那太慢了。您可以先创建一个未保存的
Sales
实例列表,然后使用
Sales.objects.bulk\u create
创建它们。这样就只需要一个插入查询,速度会快得多


不幸的是,这只会进行插入,不会更新已经存在的数据。解决这一问题的方法比我现在想给出的答案要多,最好的方法取决于与通常情况下的插入相比,有多少行将被更新。最糟糕的情况是,您确实需要对每一行进行sql更新,而且更新速度总是很慢。

您的问题更多地是关于使用
xlrd
进行高效阅读,而不是
Django
。当然,是的!但是,有没有任何软件包可以更快地读取excel并为django模型编写。有没有其他软件包可以以不同的方式更快地读取excel??我需要一些批上传和excel文件的读取,应该是一些较低的复杂性。我不认为你可以做得比xlrd更好,我一直觉得它是相当好的。但正如我所说,我不认为Excel读取是你的速度问题,数据库写入是。你能建议将数据写入django模型或数据库的方法吗。。??我要求一些不同的代码来实现这一点。