Как импортировать данные csv в модели django

У меня есть некоторые данные 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. В продукте есть такие поля, как 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

Ответ 1

Вы хотите использовать модуль csv, который является частью языка python, и вы должны использовать метод 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

Ответ 2

Если вы хотите использовать библиотеку, быстрый поиск google для csv и django показывает две библиотеки - django-csvimport и django-adaptors. Пусть читают, что они говорят о себе...

  • django-adapters:

Адаптер Django - это инструмент, который позволяет легко преобразовывать CSV/XML файл в объект python или экземпляр модели django.

  • django-importcsv:

django-csvimport - это универсальный инструмент импортера, позволяющий загрузить CSV файлы для заполнения данных.

Сначала вам нужно написать модель для соответствия файлу csv, а вторая - скорее импортером командной строки, который представляет собой огромную разницу в том, как вы с ними работаете, и каждый из них хорош для другого типа проекта.

Так какой из них использовать? Это зависит от того, какой из них будет лучше соответствовать вашему проекту в долгосрочной перспективе.

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

что-то вроде этого:

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

Ответ 6

Вы можете использовать пакет 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 ( "мой файл" )

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

Ответ 7

Рассмотрим использование встроенных десериализаторов Django. Django docs хорошо написаны и могут помочь вам приступить к работе. Подумайте о преобразовании данных из csv в XML или JSON и с помощью десериализатора для импорта данных. Если вы делаете это из командной строки (а не через веб-запрос), команда loaddata manage.py будет особенно полезна.

Ответ 8

Здесь яйцо джанго для него:

django-csvimport

Ответ 9

Вы можете попробовать django-import-export. Он имеет приятную админную интеграцию, предварительный просмотр изменений, может создавать, обновлять, удалять объекты.

Ответ 10

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

Ответ 11

Используйте Pandas library для создания данных данных 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 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 имеет так много полезных предостережений, стоит узнать

Ответ 12

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

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

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

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

Затем вам нужно перенести (в оболочке) новую таблицу продуктов с помощью:

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

Теперь каждая строка должна быть преобразована в словарь и использовать этот dict для создания экземпляра вашей модели (в данном случае Product())

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

Готово, проверьте свою базу данных сейчас.