将 csv 文件转换为 excel 的最佳方式是什么?
Which would be the best way to convert a csv file to excel?
为了更加熟悉 django,我决定建立一个网站,让用户上传一个 csv 文件,然后将其转换为 excel,用户将能够下载它。
为了实现这一点,我创建了一个名为 csv_file
的 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', )
对应的view为:
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 文件更有效地下载?
感谢您提供的任何帮助!
首先,我想指出您的示例演示了一个任意文件上传漏洞。 Pandas 不会为您验证文件格式,因此作为攻击者,我可以简单地将 malware.php.csv
之类的内容上传到您的转换脚本,我包含的任何恶意代码都将保持完整。由于您没有验证此文件的内容实际上是否为 CSV 格式,因此您为用户提供了一种直接上传具有任意扩展名的文件并可能在您的网站上执行代码的方法。由于您按照自己的方式在网页上呈现 xlsx 格式,因此很有可能有人会滥用它。如果这只是您自己的个人实验来帮助您熟悉,那是一回事,但我强烈建议不要在生产中部署它。你在这里做的事很危险。
至于你更直接的问题,我个人对 Django 并不熟悉,但这看起来与这个问题非常相似:Having Django serve downloadable files
在您的情况下,您不想将文件内容实际保存到您的服务器,而是希望处理文件内容并 return 将其放入响应正文中。 django smartfile 模块看起来正是您想要的:https://github.com/smartfile/django-transfer
这为 Apache、Nginx 和 lighttpd 提供了组件,并且应该允许您提供一种方法来在请求 upload/convert 文件后立即在响应中提供文件。我要强调的是,您需要非常小心保存这些文件的位置,验证它们的内容,确保 end-users 无法在 Web 服务器上下文中浏览或执行这些文件,并且它们会在响应后立即被删除,并且文件发送成功。
更熟悉 Django 的人可以随意纠正我或提供可用的代码示例,但根据我的经验,这种功能是将代码执行引入站点的方式。这通常是个坏主意。
为了更加熟悉 django,我决定建立一个网站,让用户上传一个 csv 文件,然后将其转换为 excel,用户将能够下载它。
为了实现这一点,我创建了一个名为 csv_file
的 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', )
对应的view为:
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 文件更有效地下载?
感谢您提供的任何帮助!
首先,我想指出您的示例演示了一个任意文件上传漏洞。 Pandas 不会为您验证文件格式,因此作为攻击者,我可以简单地将 malware.php.csv
之类的内容上传到您的转换脚本,我包含的任何恶意代码都将保持完整。由于您没有验证此文件的内容实际上是否为 CSV 格式,因此您为用户提供了一种直接上传具有任意扩展名的文件并可能在您的网站上执行代码的方法。由于您按照自己的方式在网页上呈现 xlsx 格式,因此很有可能有人会滥用它。如果这只是您自己的个人实验来帮助您熟悉,那是一回事,但我强烈建议不要在生产中部署它。你在这里做的事很危险。
至于你更直接的问题,我个人对 Django 并不熟悉,但这看起来与这个问题非常相似:Having Django serve downloadable files
在您的情况下,您不想将文件内容实际保存到您的服务器,而是希望处理文件内容并 return 将其放入响应正文中。 django smartfile 模块看起来正是您想要的:https://github.com/smartfile/django-transfer
这为 Apache、Nginx 和 lighttpd 提供了组件,并且应该允许您提供一种方法来在请求 upload/convert 文件后立即在响应中提供文件。我要强调的是,您需要非常小心保存这些文件的位置,验证它们的内容,确保 end-users 无法在 Web 服务器上下文中浏览或执行这些文件,并且它们会在响应后立即被删除,并且文件发送成功。
更熟悉 Django 的人可以随意纠正我或提供可用的代码示例,但根据我的经验,这种功能是将代码执行引入站点的方式。这通常是个坏主意。