如何导入CSV数据到Django模型

我有一些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模型。 产品中有一些领域,如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 

你想使用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。

Django文档的get_or_create方法

如果你想使用库,快速谷歌searchcsvdjango显示两个库 – django-csvimport和Django的适配器 。 让我们看看他们自己要说些什么

  • Django适配器

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

  • django-importcsv

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

第一个要求你写一个模型来匹配csv文件,而第二个是更多的命令行导入程序,这与你使用它们的方式有很大的不同 ,而且每一个都适合于不同types的项目。

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

不过,你也可以完全避免一个库,通过编写你自己的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 validation\parsing 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交互式地执行。 只要弄清楚你想要怎样处理你的项目,你需要处理多less个文件,然后 – 如果你决定使用一个库,试着找出哪一个更适合你的需求

Python的csv库可以做你的parsing,你的代码可以把它们转换成Products()

你也可以使用django-adapters

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

你声明一个MyCsvModel,它将匹配一个CSV文件,如下所示:

安东尼; 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 

像这样的东西:

 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() 

您可以使用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(“我的文件”)

这将自动创build您的产品。

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

使用Pandas库创buildcsv数据的数据框。
通过将它们包含在csv文件的第一行中或通过使用数据框的列方法在代码中命名这些字段。
然后创build一个模型实例列表。
最后使用django方法.bulk_create()将您的模型实例列表发送到数据库表。

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

 import pandas as pd 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有这么多有用的警告,这是值得去了解

这是一个Django蛋:

Django的csvimport

你可以试试django-import-export 。 它有很好的pipe理集成,更改预览,可以创build,更新,删除对象。

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

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

 python manage.py ogrinspect [/path/to/thecsv] 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 Shapefiles,但它对于标准的CSV文件也很好。

为了摄取您的数据(以CSV格式),您可以使用pandas。

 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 

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

在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 

你可以访问列表中的第i个元素作为项目[i]