【问题标题】:Which would be the best way to convert a csv file to excel?将 csv 文件转换为 excel 的最佳方法是什么?
【发布时间】:2019-06-24 20:14:55
【问题描述】:

为了更加熟悉django,我决定建立一个网站,让用户上传一个csv文件,然后将其转换为excel,用户就可以下载了。

为了实现这一点,我创建了一个带有 model FileField 的模型表单,名为 csv_file,如下所示:

#models.py

class CSVUpload(models.Model):
    csv_file = models.FileField(upload_to="csvupload/")

    def __str__(self):
        return self.csv_file


#forms.py   
class CsvForm(forms.ModelForm):
    class Meta:
        model = CSVUpload
        fields = ('csv_file', )

对应的视图是:

from django.shortcuts import render, redirect
import pandas as pd
import os

#converts file from csv to excel  
def convertcsv2excel(filename):
    fpath = os.path.join(settings.MEDIA_ROOT + "\csvupload", filename)
    df = pd.read_csv(fpath)
    newfilename = str(filename) +".xlsx"
    newpathfile = os.path.join(settings.MEDIA_ROOT, newfilename)
    df.to_excel(newpathfile, encoding='utf-8', index=False)
    return newfilename

def csvtoexcel(request):
    if request.method == 'POST':
        form = CsvForm(request.POST, request.FILES)
        if form.is_valid():
           form.save()
           print(form.cleaned_data['csv_file'].name)
           convertcsv2excel(form.cleaned_data['csv_file'].name)
           return redirect('exceltocsv')
    else:
        form = CsvForm()
    return render(request, 'xmlconverter/csvtoexcel.html',{'form': form})

现在你可以看到我正在使用 Pandas 将 csv 文件转换为 views.py 文件中的 excel。我的问题是,有没有更好的方法(例如在表单或模型模块中)以使 excel 文件更有效地下载?

感谢您提供的任何帮助!

【问题讨论】:

    标签: python django file file-conversion


    【解决方案1】:

    首先,我想指出您的示例演示了任意文件上传漏洞。 Pandas 不会为您验证文件的格式,因此作为攻击者,我可以简单地将 malware.php.csv 之类的内容上传到您的转换脚本中,我包含的任何恶意代码都将保持原样。由于您没有验证此文件的内容实际上是否为 CSV 格式,因此您为用户提供了一种直接上传具有任意扩展名的文件并可能在您的网站上执行代码的方法。由于您正在按照您的方式在网页上呈现 xlsx 格式,因此很有可能有人会滥用它。如果这只是您自己的个人实验以帮助自己熟悉,那是一回事,但我强烈建议不要在生产中部署它。你在这里做的事情很危险。

    至于你更直接的问题,我个人对Django并不熟悉,但这看起来与这个问题非常相似:Having Django serve downloadable files

    在您的情况下,您不希望将文件的内容实际保存到服务器,而是希望处理文件内容并将其返回到响应的正文中。 django smartfile 模块看起来正是您想要的:https://github.com/smartfile/django-transfer

    这为 Apache、Nginx 和 lighttpd 提供了组件,并且应该允许您在请求上传/转换文件后立即在响应中提供文件。我要强调的是,您需要非常小心保存这些文件的位置,验证它们的内容,确保最终用户无法在 Web 服务器上下文中浏览或执行这些文件,并且在响应和文件被删除后它们会立即被删除发送成功。

    更熟悉 Django 的人可以随时纠正我或提供可用的代码示例,但根据我的经验,这种功能是您将代码执行引入您的站点的方式。这通常是个坏主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-22
      • 2020-06-20
      • 2016-05-29
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多