首页 > 解决方案 > 如何将 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 %}

标签: djangopython-3.x

解决方案


如果您通过表单上传文件,则添加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

推荐阅读