【问题标题】:Django - how to import from a .csv file in memoryDjango - 如何从内存中的 .csv 文件导入
【发布时间】:2016-06-07 15:40:19
【问题描述】:

我正在编写一个页面来上传 .csv 文件并将其内容导入我的模型。我目前的看法:

class ContentImport(LoginRequiredMixin, PermissionRequiredMixin,View):
    permission_required = 'delivery.change_delivery' 

    def get(self, request, *args, **kwargs):             
        form = UploadFileForm()
        return render(request, 'delivery/content_import.html', { 'form': form })    

    def import_contents(self, f):
        reader = csv.reader(f)
        for row in reader:
            print row[0] 

    def post(self, request, *args, **kwargs):

        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            self.import_contents(request.FILES['file'].read())
            messages.add_message(self.request, messages.SUCCESS, "Contents deleted successfully.")
            return redirect(reverse('delivery:delivery-detail', args=[self.kwargs['delivery_id']])) 
        else:
            messages.add_message(self.request, messages.ERROR, "Select a file to upload.")
            return redirect(reverse('delivery:delivery-content-import', args=[self.kwargs['delivery_id']])) 

我的问题是关于import_contents 方法和对它的调用self.import_contents(request.FILES['file'].read())。当我print row[0] 时出现以下错误:列表索引超出范围。

我对此视图的想法是上传文件,而不是将其保存在服务器中,从内存中读取 .csv 并在我的模型中创建新记录。这是从 .csv 中读取的,我从 stackoverflow 中的其他答案中得到。

我认为问题在于我如何将文件传递给 import_contents 函数或如何从中读取。我就是想不通。你能帮助我吗?如果您对如何以更简单的方式或正确的方式进行操作有任何建议,请告诉我。

感谢您的帮助

【问题讨论】:

标签: python django csv


【解决方案1】:

这是你的问题。

self.import_contents(request.FILES['file'].read())

csv.reader() 需要一个类似对象的文件,而不是它的内容。

This绝对可以理解为相关答案。

【讨论】:

  • 正如丹尼尔在我的问题中评论的那样,没有 .read() 作品。现在我正在处理导入。当我调用 row[0] 时,它返回整行,而不是第 0 列。感谢您的回答!
  • 酷。但是当前的csv.reader() 问题可以在 python/django 控制台上轻松调试。如果它有帮助:差异可能在于delimiterquotechar docs.python.org/2/library/csv.html 也许,方言选项可能对您有所帮助。
  • 谢谢,它成功了。阅读器现在是这样并按预期工作:reader = csv.reader(f,delimiter=';', quotechar='"')
猜你喜欢
  • 1970-01-01
  • 2017-02-19
  • 2017-10-14
  • 2023-03-11
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
相关资源
最近更新 更多