Как импортировать данные CSV в модели Django - PullRequest
55 голосов
/ 17 марта 2010

У меня есть некоторые данные CSV, и я хочу импортировать их в модели django на примере данных CSV:

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";

У меня есть несколько моделей Django с именем Product. В Product есть несколько полей типа name, description и price. Я хочу что-то вроде этого:

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

Ответы [ 13 ]

67 голосов
/ 12 апреля 2013

Вы хотите использовать модуль csv, который является частью языка Python, и вам следует использовать метод get_or_create Django

 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

26 голосов
/ 10 июля 2014

Если вы хотите использовать библиотеку, быстрый поиск в Google для csv и django обнаружит две библиотеки - django-csvimport и django-adapters . Давайте прочитаем, что они говорят о себе ...

  • 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 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, если это одноразовый импорт. Просто - выясните, что вы хотите сделать со своим проектом, сколько файлов вам нужно обработать, а затем - если вы решите использовать библиотеку, попробуйте выяснить, какая из них лучше подходит вашим потребностям .

8 голосов
/ 06 октября 2012

Вы также можете использовать django-адаптеры

>>> 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
8 голосов
/ 17 марта 2010

Библиотека Python csv может выполнить ваш анализ, а ваш код может перевести их в Products().

6 голосов
/ 17 марта 2010

как то так:

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()  
4 голосов
/ 27 июня 2018

Для django 1.8, который я использую,

Я сделал команду, что вы можете создавать объекты динамически в будущем, так что вы можете просто указать путь к файлу CSV, имя модели и имя приложения соответствующего приложения django, и оно заполнит соответствующую модель без указания имен полей. так что если мы возьмем, например, следующий CSV:

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

это создаст объекты [{field1: значение1, поле2: значение2, поле3: значение3}, {поле1: значение11, поле2: значение22, поле3: значение33}] для названия модели вы введете в команду.

код команды:

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
4 голосов
/ 02 октября 2011

Вы можете использовать пакет django-csv-importer. http://pypi.python.org/pypi/django-csv-importer/0.1.1

Работает как модель Джанго

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

    class Meta:
        delimiter = ";"
        dbModel = Product

И вам просто нужно: CsvModel.import_from_file ("мой файл")

Это автоматически создаст ваши продукты.

2 голосов
/ 21 августа 2017

Если вы работаете с новыми версиями Django (> 10) и не хотите тратить время на написание определения модели. Вы можете использовать инструмент ogrinspect.

Это создаст определение кода для модели.

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

Выходными данными будет определение класса (модели). В этом случае модель будет называться Product . Вам необходимо скопировать этот код в файл models.py.

После этого вам нужно перенести (в оболочке) новую таблицу Product с:

python manage.py makemigrations
python manage.py migrate

Больше информации здесь: https://docs.djangoproject.com/en/1.11/ref/contrib/gis/tutorial/

Обратите внимание, что пример был сделан для шейп-файлов ESRI, но он довольно хорошо работает и со стандартными файлами CSV.

Для приема ваших данных (в формате 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

Готово, проверьте вашу базу данных.

1 голос
/ 23 октября 2015

Используйте библиотеку Pandas для создания фрейма данных csv.
Назовите поля либо включив их в первую строку CSV-файла, либо в коде, используя метод столбцов dataframe.
Затем создайте список экземпляров модели.
Наконец, используйте метод django .bulk_create () , чтобы отправить список экземпляров модели в таблицу базы данных.

Функция read_csv в pandas отлично подходит для чтения 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 (';' ) метод.

У Панд столько полезных предостережений, что стоит узнать

1 голос
/ 13 августа 2015

определяет класс в 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]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...