Python Django ValidationError CSV上载

Python Django ValidationError CSV上载,python,django,csv,Python,Django,Csv,我正试图上传一个CSV文件到我的Django模型中。尽管数据上传工作正常(所有行都被复制到数据库中),但Django在最后返回一条ValidationError[“''值必须是十进制数]错误消息。 从错误消息的localvars部分我可以找到原因——当迭代到达包含数据的行的末尾时,显然没有十进制数。所以Django抛出了一个错误。然而,我不明白为什么,因为总是有最后一行之后没有更多的数据。我东拉西扯地想找出问题所在。一种有效的方法是将原始CSV中的所有数据复制到一个新的CSV中——不再有任何错误

我正试图上传一个CSV文件到我的Django模型中。尽管数据上传工作正常(所有行都被复制到数据库中),但Django在最后返回一条
ValidationError[“''值必须是十进制数]
错误消息。 从错误消息的localvars部分我可以找到原因——当迭代到达包含数据的行的末尾时,显然没有十进制数。所以Django抛出了一个错误。然而,我不明白为什么,因为总是有最后一行之后没有更多的数据。我东拉西扯地想找出问题所在。一种有效的方法是将原始CSV中的所有数据复制到一个新的CSV中——不再有任何错误消息。我想用原始CSV文件完成整个过程,并且没有错误消息!非常感谢您的帮助

我的CSV文件是CSV UTF-8,它们保存在Excel中

型号.py

from django.db import models

class Testdata3(models.Model):
    key = models.CharField(max_length=100, primary_key=True)
    assetclass = models.CharField(max_length=25)
    value = models.DecimalField(max_digits=25,decimal_places=10)
    performance = models.DecimalField(max_digits=25,decimal_places=10)

    def __str__(self):
        return self.key
from django.shortcuts import render

from .models import Testdata3
import csv, io
from django.contrib import messages


def file_upload(request):
    template = "upload.html"
    prompt = {
        'order': 'Order of the CSV should be "placeholder_1", "placeholder_2", "placeholder_3" '
    }

    if request.method == "GET":
        return render(request, template, prompt)

    csv_file = request.FILES['file']

    if not csv_file.name.endswith('.csv'):
        messages.error(request, 'This is not a csv file')

    data_set = csv_file.read().decode('UTF-8')

    io_string = io.StringIO(data_set)
    next(io_string)
    for column in csv.reader(io_string, delimiter=';', quotechar="|"):
        _, created = Testdata3.objects.update_or_create(
            key = column[0],

            defaults = {
            'key' : column[0],
            'assetclass' : column[10],
            'value' : column[16],
            'performance' : column[18],
            }
        )
        context = {}

    return render(request, template, context)
视图.py

from django.db import models

class Testdata3(models.Model):
    key = models.CharField(max_length=100, primary_key=True)
    assetclass = models.CharField(max_length=25)
    value = models.DecimalField(max_digits=25,decimal_places=10)
    performance = models.DecimalField(max_digits=25,decimal_places=10)

    def __str__(self):
        return self.key
from django.shortcuts import render

from .models import Testdata3
import csv, io
from django.contrib import messages


def file_upload(request):
    template = "upload.html"
    prompt = {
        'order': 'Order of the CSV should be "placeholder_1", "placeholder_2", "placeholder_3" '
    }

    if request.method == "GET":
        return render(request, template, prompt)

    csv_file = request.FILES['file']

    if not csv_file.name.endswith('.csv'):
        messages.error(request, 'This is not a csv file')

    data_set = csv_file.read().decode('UTF-8')

    io_string = io.StringIO(data_set)
    next(io_string)
    for column in csv.reader(io_string, delimiter=';', quotechar="|"):
        _, created = Testdata3.objects.update_or_create(
            key = column[0],

            defaults = {
            'key' : column[0],
            'assetclass' : column[10],
            'value' : column[16],
            'performance' : column[18],
            }
        )
        context = {}

    return render(request, template, context)
upload.html

{% if messages %}
    {% for message in messages %}
        <div>
            <strong>{{message|safe}}</strong>
        </div>
    {% endfor %}
{%else %}
{{ order }}
<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <label>Upload a file</label>
    <input type="file" name="file">
    <p>Only accepts CSV files</p>
    <button type="submit">Upload</button>
</form>
{% endif %}
{%if消息%}
{消息%中的消息为%s}
{{message | safe}}
{%endfor%}
{%else%}
{{order}}
{%csrf_令牌%}
上传文件
仅接受CSV文件

上传 {%endif%}
我找到了解决办法!我包括了一个if语句,它检查当前迭代是否只有空值,如果是,则跳到下一个迭代

# ... 

views.py

    for column in csv.reader(io_string, delimiter=';', quotechar="|"):
        # Check for empty rows in CVS and jump to next iteration if empty
        if all(elem == "" for elem in column):
            next
        else:
            _, created = Testdata3.objects.update_or_create(
                key = column[0],

                defaults = {
                'key' : column[0],
                'assetclass' : column[10],
                'value' : column[16],
                'performance' : column[18],
                }
            )

# ...

我相信你已经检查过了,csv末尾有空行吗?你可以在文本编辑器中查看。非常感谢@brandonbanks!这确实是一个问题——我没有检查这一点,因为我不知道这会导致问题。现在,我试图找出如何消除CSV文件末尾的空行。有人能解决这个问题吗?当然!很乐意帮忙。很好地解决了这个问题。