如何将 csv 数据导入 django 模型

2025-03-05 09:17:00
admin
原创
46
摘要:问题描述:我有一些 CSV 数据,我想使用示例 CSV 数据导入 django 模型:1;"02-01-101101";"Worm Gear HRF 50";"Ratio 1 : 10";"input shaft, output shaft...

问题描述:

我有一些 CSV 数据,我想使用示例 CSV 数据导入 django 模型:

1;"02-01-101101";"Worm Gear HRF 50";"Ratio 1 : 10";"input shaft, output shaft, direction A, color dark green";
2;"02-01-101102";"Worm Gear HRF 50";"Ratio 1 : 20";"input shaft, output shaft, direction A, color dark green";
3;"02-01-101103";"Worm Gear HRF 50";"Ratio 1 : 30";"input shaft, output shaft, direction A, color dark green";
4;"02-01-101104";"Worm Gear HRF 50";"Ratio 1 : 40";"input shaft, output shaft, direction A, color dark green";
5;"02-01-101105";"Worm Gear HRF 50";"Ratio 1 : 50";"input shaft, output shaft, direction A, color dark green";

我有一些名为 Product 的 Django 模型。Product 中有一些字段,如namedescriptionprice。我想要这样的东西:

product=Product()
product.name = "Worm Gear HRF 70(02-01-101116)"
product.description = "input shaft, output shaft, direction A, color dark green"
product.price = 100

解决方案 1:

您想要使用属于 Python 语言的 csv 模块,并且应该使用 Django 的 get_or_create 方法

 with open(path) as f:
        reader = csv.reader(f)
        for row in reader:
            _, created = Teacher.objects.get_or_create(
                first_name=row[0],
                last_name=row[1],
                middle_name=row[2],
                )
            # creates a tuple of the new object or
            # current object and a boolean of if it was created

在我的例子中,模型老师有三个属性first_name、last_name和middle_name。

get_or_create 方法的 Django 文档

解决方案 2:

如果你想使用一个库,快速谷歌搜索csvdjango显示两个库 - django-csvimport和django-adaptors。让我们看看他们对自己说了什么......

  • django-适配器

Django 适配器是一个工具,它允许您轻松地将 CSV/XML 文件转换为 python 对象或 django 模型实例。

  • django-importcsv

django-csvimport 是一个通用导入工具,允许上传 CSV 文件来填充数据。

第一个需要你编写一个模型来匹配 csv 文件,而第二个更像是一个命令行导入器,这与你使用它们的方式有很大不同,并且每个都适用于不同类型的项目。

那么该使用哪一个呢?这取决于从长远来看哪一个更适合您的项目。

但是,您也可以完全避免使用库,通过编写自己的 django 脚本来导入 csv 文件,类似以下内容(警告,前方为伪代码):

# open file & create csvreader
import csv, yada yada yada

# import the relevant model
from myproject.models import Foo

#loop:
for line in csv file:
     line = parse line to a list
     # add some custom validationparsing for some of the fields

     foo = Foo(fieldname1=line[1], fieldname2=line[2] ... etc. )
     try:
         foo.save()
     except:
         # if the're a problem anywhere, you wanna know about it
         print "there was a problem with line", i 

这非常简单。当然,如果是一次性导入,您可以通过 django shell 以交互方式进行。只需弄清楚您想用项目做什么,需要处理多少个文件,然后如果您决定使用库,请尝试找出哪一个更适合您的需求

解决方案 3:

使用Pandas 库创建 csv 数据的数据框。

通过在 csv 文件的第一行中包含字段或使用数据框的列方法在代码中命名字段。

然后创建模型实例列表。

最后使用 django 方法.bulk_create()将模型实例列表发送到数据库表。

pandas 中的read_csv函数非常适合读取 csv 文件,并为您提供了许多参数来跳过行、省略字段等。

import pandas as pd
from app.models import Product

tmp_data=pd.read_csv('file.csv',sep=';')
#ensure fields are named~ID,Product_ID,Name,Ratio,Description
#concatenate name and Product_id to make a new field a la Dr.Dee's answer
products = [
    Product(
        name = tmp_data.ix[row]['Name'], 
        description = tmp_data.ix[row]['Description'],
        price = tmp_data.ix[row]['price'],
    )
    for row in tmp_data['ID']
]
Product.objects.bulk_create(products)

我使用了 mmrs151 的答案,但保存每一行(实例)都非常慢,并且任何包含分隔字符的字段(即使在引号内)都无法由 open() -- line.split(';') 方法处理。

Pandas 有很多有用的注意事项,值得了解

解决方案 4:

您还可以使用django-adaptors

>>> from adaptor.model import CsvModel
>>> class MyCSvModel(CsvModel):
...     name = CharField()
...     age = IntegerField()
...     length = FloatField()
...
...     class Meta:
...         delimiter = ";"

您声明一个与 CSV 文件匹配的 MyCsvModel,如下所示:

安东尼;27;1.75

要导入文件或任何可迭代对象,只需执行以下操作:

>>> my_csv_list = MyCsvModel.import_data(data = open("my_csv_file_name.csv"))
>>> first_line = my_csv_list[0]
>>> first_line.age
    27

如果没有明确声明,数据和列将按相同的顺序匹配:

Anthony --> Column 0 --> Field 0 --> name
27      --> Column 1 --> Field 1 --> age
1.75    --> Column 2 --> Field 2 --> length

解决方案 5:

对于我使用的 django 1.8,

我创建了一个命令,您可以在将来动态创建对象,因此您只需输入 csv 的文件路径、模型名称和相关 django 应用程序的应用程序名称,它就会填充相关模型而无需指定字段名称。因此,如果我们以下一个 csv 为例:

field1,field2,field3
value1,value2,value3
value11,value22,value33

它将为您在命令中输入的模型名称创建对象 [{field1:value1,field2:value2,field3:value3}, {field1:value11,field2:value22,field3:value33}]。

命令代码:

from django.core.management.base import BaseCommand
from django.db.models.loading import get_model
import csv


class Command(BaseCommand):
    help = 'Creating model objects according the file path specified'

    def add_arguments(self, parser):
        parser.add_argument('--path', type=str, help="file path")
        parser.add_argument('--model_name', type=str, help="model name")
        parser.add_argument('--app_name', type=str, help="django app name that the model is connected to")

    def handle(self, *args, **options):
        file_path = options['path']
        _model = get_model(options['app_name'], options['model_name'])
        with open(file_path, 'rb') as csv_file:
            reader = csv.reader(csv_file, delimiter=',', quotechar='|')
            header = reader.next()
            for row in reader:
                _object_dict = {key: value for key, value in zip(header, row)}
                _model.objects.create(**_object_dict)

请注意,也许在以后的版本中

from django.db.models.loading import get_model

已弃用,需要更改为

from django.apps.apps import get_model

解决方案 6:

Python csv 库可以进行解析,并且您的代码可以将它们转换成Products()

解决方案 7:

像这样:

f = open('data.txt', 'r')  
for line in f:  
   line =  line.split(';')  
   product = Product()  
   product.name = line[2] + '(' + line[1] + ')'  
   product.description = line[4]  
   product.price = '' #data is missing from file  
   product.save()  

f.close()  

解决方案 8:

在 Django 应用程序中编写命令。您需要提供一个 CSV 文件并循环它并为每一行创建一个模型。

your_app_folder/management/commands/ProcessCsv.py

import os
from django.core.management.base import BaseCommand
from django.conf import settings
from your_app_name.models import Product

class Command(BaseCommand):
    def handle(self, *args, **options):
        with open(os.path.join(settings.BASE_DIR / 'your_csv_file.csv'), 'r') as csv_file:
            csv_reader = csv.reader(csv_file, delimiter=';')
            for row in csv_reader:
                Product.objects.create(name=row[2], description=row[3], price=row[4])

最后只需运行命令来处理您的 CSV 文件并将其插入 Product模型。

终端:
python manage.py ProcessCsv

就是这样。

解决方案 9:

您可以尝试django-import-export。它具有良好的管理集成,更改预览,可以创建、更新、删除对象。

解决方案 10:

如果您正在使用新版本的 Django(> 10)并且不想花时间编写模型定义,则可以使用 ogrinspect 工具。

这将为模型创建一个代码定义。

python manage.py ogrinspect [/path/to/thecsv] Product

输出将是类(模型)定义。在本例中,模型将被称为Product。您需要将此代码复制到 models.py 文件中。

之后,您需要使用以下命令迁移(在 shell 中)新的 Product 表:

python manage.py makemigrations
python manage.py migrate

更多信息请访问:
https://docs.djangoproject.com/en/1.11/ref/contrib/gis/tutorial/

请注意,该示例是针对 ESRI Shapefile 完成的,但它也适用于标准 CSV 文件。

您可以使用 pandas 来获取数据(CSV 格式)。

import pandas as pd
your_dataframe = pd.read_csv(path_to_csv)
# Make a row iterator (this will go row by row)
iter_data = your_dataframe.iterrows()

现在,每一行都需要转换成一个字典,并使用该字典来实例化你的模型(在本例中为 Product())

# python 2.x
map(lambda (i,data) : Product.objects.create(**dict(data)),iter_data

完成,现在检查您的数据库。

解决方案 11:

您可以使用 django-csv-importer 包。http
://pypi.python.org/pypi/django-csv-importer/0.1.1

它的工作原理类似于 Django 模型

MyCsvModel(CsvModel):
    field1 = IntegerField()
    field2 = CharField()
    etc

    class Meta:
        delimiter = ";"
        dbModel = Product

你只需要:CsvModel.import_from_file("my file")

这将自动创建您的产品。

解决方案 12:

这是基于Erik 之前的回答,但我发现最简单的方法是使用 pandas 读取 .csv 文件,然后为数据框中的每一行创建该类的新实例。

此示例已更新,iloc因为pandas最新版本中不再使用 ix。我不知道 Erik 的情况,但您需要在 for 循环之外创建列表,否则它不会附加到您的数组中,而只是覆盖它。

import pandas as pd
df = pd.read_csv('path_to_file', sep='delimiter')
products = []
for i in range(len(df)):
    products.append(
        Product(
        name=df.iloc[i][0]
        description=df.iloc[i][1]
        price=df.iloc[i][2]
        )
    )
Product.objects.bulk_create(products)

这只是将 DataFrame 分解为一个行数组,然后从零索引中选择该数组中的每一列。(即名称是第一列,描述是第二列,等等)

希望有所帮助。

解决方案 13:

这是一个 Django egg:

django-csvimport

解决方案 14:

考虑使用 Django 的内置反序列化器。Django 的文档写得很好,可以帮助您入门。考虑将数据从 csv 转换为 XML 或 JSON,并使用反序列化器导入数据。如果您从命令行(而不是通过 Web 请求)执行此操作,loaddatamanage.py 命令将特别有用。

解决方案 15:

在 models.py 中定义类并在其中定义一个函数。

class all_products(models.Model):
    def get_all_products():
        items = []
        with open('EXACT FILE PATH OF YOUR CSV FILE','r') as fp:
            # You can also put the relative path of csv file
            # with respect to the manage.py file
            reader1 = csv.reader(fp, delimiter=';')
            for value in reader1:
                items.append(value)
        return items

您可以通过 items[i] 访问列表中的第 i 个元素

解决方案 16:

如果您使用Postgres& psycopg2,则可以使用该Cursor对象直接导入文本文件 -

from io import BytesIO

from django.db import connection


table = "<Table Name>"
columns = ["<Column Names>"]
file = BytesIO(
    b"""
    1;"02-01-101101";"Worm Gear HRF 50";"Ratio 1 : 10";"input shaft, output shaft, direction A, color dark green";
    2;"02-01-101102";"Worm Gear HRF 50";"Ratio 1 : 20";"input shaft, output shaft, direction A, color dark green";
    3;"02-01-101103";"Worm Gear HRF 50";"Ratio 1 : 30";"input shaft, output shaft, direction A, color dark green";
    4;"02-01-101104";"Worm Gear HRF 50";"Ratio 1 : 40";"input shaft, output shaft, direction A, color dark green";
    5;"02-01-101105";"Worm Gear HRF 50";"Ratio 1 : 50";"input shaft, output shaft, direction A, color dark green";
    """
)
with connection.cursor() as cursor:
    cursor.copy_from(
        file=file,
        table=table,
        sep=';',
        columns=columns,
    )

灵感:https://hakibenita.com/fast-load-data-python-postgresql

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1911  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1430  
  在制造业数字化转型的进程中,PLM(产品生命周期管理)系统、ERP(企业资源计划)系统、MES(制造执行系统)以及 CAD(计算机辅助设计)软件都扮演着至关重要的角色。然而,这些系统和软件各自独立运行时,往往难以发挥出最大的协同效应。实现 PLM 系统与 ERP、MES、CAD 的有效集成,成为提升企业整体竞争力、优化...
plm系统的主要功能模块   22  
  产品生命周期管理(PLM)作为一种先进的管理理念和技术,在电子与半导体行业正发挥着日益重要的作用。随着电子与半导体行业的快速发展,产品更新换代速度加快,市场竞争愈发激烈,企业面临着诸多挑战,如缩短产品上市时间、提高产品质量、降低成本等。而PLM的应用为企业应对这些挑战提供了有效的解决方案,展现出巨大的应用价值。提升产品...
plm项目   18  
  PLM(产品生命周期管理)项目管理软件在现代企业的产品研发、生产与运营中扮演着至关重要的角色。它整合了从产品概念设计到退役的全流程数据与流程,助力企业提升效率、降低成本并增强创新能力。随着科技的飞速发展以及企业需求的不断演变,未来十年 PLM 项目管理软件的发展充满了无限可能,值得深入探讨与预测。智能化与自动化趋势智能...
plm产品全生命周期管理   23  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用