如何在Django中无需存储.csv文件直接读取其内容数据
Django 无需持久化存储CSV直接读取内容的实现方法
你完全可以跳过存储CSV到模型的步骤,直接读取上传文件的内容解析,Django的上传文件对象本身就是类文件结构,不需要落地存储就能操作。
以下是调整后的视图代码:
import csv from io import TextIOWrapper def ncaab_csv(request): form = CsvUpload(request.POST or None, request.FILES or None) template = 'management/ncaab/ncaab_csv.html' if request.method == "POST": if form.is_valid(): # 直接从表单清理后的数据中获取上传的CSV文件,无需保存到模型 csv_file = form.cleaned_data['file'] # 这里的file替换为你CsvUpload表单里的文件字段名 # 把字节流包装为文本流,适配csv.reader的读取要求,编码可根据实际情况调整 wrapper = TextIOWrapper(csv_file, encoding='utf-8') reader = csv.reader(wrapper) for i, row in enumerate(reader): if i == 0: # 跳过表头 continue try: game = NCAABGame.objects.get(name__name=row[1], updated=False, date=today) # 此处填充NCAABGame的所有字段 game.save() except NCAABGame.DoesNotExist: # 可根据业务需求补充不存在记录的处理逻辑 pass # 处理完成后直接跳转,无需操作Csv模型 return redirect(reverse('ncaab_games')) else: messages.error(request, "文件上传失败,请检查文件格式后重试。") context = { 'form': form, } return render(request, template, context)
关键注意点
- 表单文件字段名:
form.cleaned_data['file']中的键名要和你CsvUpload表单类里定义的CSV文件字段名称保持一致 - 编码适配:如果上传的CSV是中文Windows系统导出的GBK/GB2312编码,把
encoding='utf-8'替换为encoding='gbk'即可避免乱码 - 性能优化:如果CSV行数较多,建议收集完所有待更新的对象后用
bulk_update批量写入,减少数据库交互次数,提升处理效率 - 大文件兼容:如果上传的CSV超过Django默认的2.5M内存存储阈值,文件会自动暂存到系统临时目录,处理完成后会自动清理,无需手动维护临时文件
内容的提问来源于stack exchange,提问作者Ryan Thomas
相关产品推荐
相关产品推荐

