【问题标题】:loading data from a csv file into a Django model将 csv 文件中的数据加载到 Django 模型中
【发布时间】:2016-12-13 17:33:42
【问题描述】:

我有一个简单但令人沮丧的问题,我似乎无法弄清楚。

我正在尝试将数据从 csv 文件加载到 Django 模型中。为此,我编写了以下脚本作为视图:

import csv
def import_db(request):
    dataReader = csv.reader(open('/home/<name>/webapps/<name2>/employees.csv'), delimiter=',', quotechar='"')
    for row in dataReader:
        emp = Employee()
        emp.first_name = row[0]
        emp.last_name = row[1]
        emp.email = row[2]
        emp.level = row[3]
        emp.service_area = row[4]
        emp.service_line = row[5]
        emp.office = row[6]
        emp.save()
return HttpResponse("Completed", content_type="text/plain")

我已将视图链接到如下网址:

from reviews import views as emp  
url(r'^load/$',   emp.import_db, name='importdb')

我的想法是,当我转到链接 sitename.com/load 时,我的数据将从我的 employee.csv 文件加载到我的 Employee 模型中。

问题是当我运行这个脚本时,我的 Django 模型中的 csv 文件中的每一行都有 2 个条目。我在 csv 中有 1530 条员工行,当我这样做时,模型会填充 3060 个实例。更烦人的是,模型中条目的顺序与 csv 文件的顺序不同,所以我不能简单地删除 1530 个模型实例的第二个“组”。即使我尝试使用 csv 文件中 20 行数据的子集,我也会得到 40 个模型实例。知道为什么会发生这种情况以及我能做些什么来解决它吗?

非常感谢!

【问题讨论】:

  • 什么是 Employee() ?是你的模特吗?

标签: django python-2.7 csv django-models


【解决方案1】:

在视图函数中执行此逻辑不是一个好主意。我不知道您的确切原因,但是可以两次触发相同的视图功能(例如,Google Chrome 之类的浏览器通常会在您将 URL 粘贴到地址栏中后立即在后台预取它们 - 这可能会导致两次符合这种观点。我不知道这是否是这里的问题,但可能值得排除)。

您应该考虑将此逻辑移动到您可以确定地调用的custom management command。比如:

# myapp/management/commands/import_csv.py
from django.core.management.base import BaseCommand, CommandError


class Command(BaseCommand):

    def add_arguments(self, parser):
        parser.add_argument('csv_file', nargs='+', type=str)

    def handle(self, *args, **options):
        for csv_file in options['csv_file']:
            dataReader = csv.reader(open(csv_file), delimiter=',', quotechar='"')
            for row in dataReader:
                emp = Employee()
                # etc...
                self.stdout.write(
                    'Created employee {} {}'.format(emp.first_name, emp.last_name)
                )

然后你会调用它:

./manage.py import_csv --csvfile "/home/<name>/webapps/<name2>/employees.csv"

这种方法使您可以更好地控制正在发生的事情,并且可以更轻松地调试问题(如果仍然存在问题)。

【讨论】:

  • 感谢您的回答,我尝试实现它,但它导致我进入“第 20 行,在句柄 dataReader = csv.reader(open(csv_file), delimiter=',', quotechar='” ') FileNotFoundError: [Errno 2] No such file or directory: 'csv_file' " . 有什么问题吗?更多详情请看这里:stackoverflow.com/a/58326339/7658051
【解决方案2】:

在您打开文件的位置,检查行数,请执行以下操作:

    reader = csv.reader(open('/home/<name>/webapps/<name2>/employees.csv'), delimiter=',', quotechar='"')
    data = list(reader)
    print len(data) # check this

【讨论】:

    【解决方案3】:

    如果您希望只有您的管理员能够导入文件,而不是您的应用程序用户,您可以使用 django-import-export。 这是一个小部件,可让您从管理部分导入 excel 文件。

    阅读docs
    在这里你可以找到installation tutorial,在这里你可以找到expample

    它非常易于安装,并且比实施自定义管理命令更加用户友好。如果您想在将数据插入数据之前“标准化”/“预格式化”数据(例如统一字符'“'',或 e'è é,或 à a',或 ò o ', ecc.)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 2021-01-24
      • 2017-06-03
      • 2016-04-17
      • 1970-01-01
      • 2019-02-13
      相关资源
      最近更新 更多