将csv文件转换为excel的最佳方式是什么?

2024-05-21 08:58:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

#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文件转换为excel文件视图.py文件。我的问题是,有没有更好的方法(例如在表单或模型模块中)使excel文件更有效地可下载?你知道吗

我很感激你能提供的任何帮助!你知道吗


Tags: 文件csvtopyimportformreturnos
1条回答
网友
1楼 · 发布于 2024-05-21 08:58:00

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

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

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

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

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

相关问题 更多 >