django - 如何将 CSV 文件保存在变量中
问题描述
我是 Django 和 Python 的新手。我正在尝试比较两个 CSV 文件并在我的views.py 中创建一个新文件(这两个文件彼此有多少不同)。首先,我获取这些文件并将它们设置为一个变量,以确保用户可以选择和比较具有任何名称的任何文件。但我得到了这个错误。
FileNotFoundError at /compare
[Errno 2] No such file or directory: 'fine_name.csv'
我期待的是,当用户选择两个文件并点击比较按钮时,他们会得到一个新的更新的 CSV 文件“update.csv”。
这是我的代码
视图.py
from django.shortcuts import render
from django.http import HttpResponse
def comp(request):
if request.method == 'POST':
file1 = request.POST.get('file1', '')
file2 = request.POST.get('file2','')
with open(file1, 'r') as t1, open(file2, 'r') as t2:
fileone = t1.readlines()
filetwo = t2.readlines()
with open('update.csv', 'w') as outFile:
for line in filetwo:
if line not in fileone:
outFile.write(line)
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="update.csv"'
return response
return render(request,'compare.html')
比较.html
{% extends 'base.html' %}
{% block title %}Comparision{% endblock %}
{% block content %}
<div class="container">
<div class="row justify-content-md-center">
<div class="col-md-6">
<form method="POST" action="">{% csrf_token %}
<h1 class="mb-3 display-4 text-light">Comparision</h1>
<input type="file" id="file1" name="file1" class="form-control mt-3" required autofocus>
<input type="file" id="file2" name="file2" class="form-control mt-3" required autofocus>
<button class="mt-3 col-md-3 btn btn-lg btn-info btn-block" type="submit">Compare</button>
</form>
</div>
</div>
{% endblock %}
解决方案
如果您通过表单上传文件,则添加enctype="multipart/form-data"
html 表单标签:
<form method="POST" action="" enctype="multipart/form-data">
{% csrf_token %} # rest of the form
然后,您需要从 读取文件request.FILES
,如下所示:
file1 = request.FILES['file1'].read().decode("utf-8")
file2 = request.FILES['file2'].read().decode("utf-8")
现在,您可以像这样读取文件:
lines = file1.split("\n")
for line in lines:
fields = line.split(",")
最后,在输出 csv 时,您可以使用django's example
用于输出 csv。像这样:
import csv
from django.http import HttpResponse
def comp(request):
# rest of the code
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
writer = csv.writer(response)
updated_csv_list = []
for line in file1:
updated_csv_list.append(line.split(','))
for line in file2:
llist = line.split(',')
if llist not in updated_csv_list:
updated_csv_list.append(llist)
for line in updated_csv_list:
writer.writerow(line)
return response
推荐阅读
- apache-kafka - 向 Avro 架构添加新字段使其与早期版本不兼容
- python - PyCharm 抛出错误“没有名为 pymongo 的模块”
- c# - 使用 DeviceEnumeration - 将基于 IP 的摄像头连接到 Windows
- sql - 如何在 SQL 中解析 Json
- ios - 如何使用 SwiftUI 实现可以读取和写入 NFC 标签的 NFC 扫描仪?
- javascript - 如何使用 Apollo GraphQL 更改查询值(其中:{ })
- java - Hibernate 错误(JPA 查询 + SpEL 表达式):org.hibernate.QueryException:未绑定命名参数
- java - ProprityQueue 的奇怪行为
- c# - 共享项目时如何检测并显示给编辑者?
- python - Python unittest,跳过没有输入的测试