2010-03-17 6 views
45

У меня есть некоторые данные CSV, и я хочу, чтобы импортировать в модель Джанго, используя пример CSV данных:как импортировать данные 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"; 

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

также является удивительной библиотекой для этого. –

ответ

8

Питон csv library может сделать ваш синтаксический и ваш код может перевести их в Products().

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/18953889) – AK47

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

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

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

+3

django-csv-importer больше не поддерживается в пользу django-адаптеров – trez

8

Вы также можете использовать, 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 
+0

Знаете ли вы, что метод исправления записи аргумента обновления в классе Meta внутри моего Csvmodel? Я пытаюсь это сделать, но у меня есть KeyError. –

52

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

+0

Спасибо за ответ. Чтобы добавить, обязательно пропустите строку заголовка, если она у вас есть. Не игнорируя этого, это может привести к ошибкам с отладочными ошибками: http://stackoverflow.com/questions/43114679/django-get-or-create-returning-models-doesnotexist-while-importing-a-csv – Anupam

1

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

+0

FYI : объединено с http://stackoverflow.com/questions/24660654/csv-file-import-to-django – Shog9

0

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

+0

FYI: слито из http://stackoverflow.com/questions/24660654/csv-file-import-to-django – Shog9

23

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

  • Джанго-адаптеры:

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

  • Джанго-importcsv:

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

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

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

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

+0

FYI: слито из http://stackoverflow.com/questions/24660654/csv-file-import-to-django – Shog9

+1

@ Shog9 Я только сейчас это заметил. Я не понимаю, почему? эти два вопроса вообще не связаны, и это делает мой весь ответ бессмысленным объяснением чего-то совершенно иного, чем то, о чем просит ОП. Разве это не должно быть слито наоборот? – yuvi

+0

Оба вопроса касаются одной и той же проблемы, но это лучший вопрос с точки зрения предоставления примера другим. Если вы не возражаете против редактирования, я думаю, что ваш ответ может быть полезен здесь. – Shog9

0

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

1

Используйте Pandas library создать dataframe данных в формате 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 но сохранять каждую строку (например) был очень медленным и любые поля, содержащие символ, ограничивающую (даже внутри кавычек) не были обработаны открытым() - line.split (';').

Панда имеет так много полезных предостережений, это стоит того, чтобы знать

0

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

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

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

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

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

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

Теперь, каждая строка должна быть преобразована в словарь и использовать этот Dict для инстанцирования модели (в данном случае продукт())

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

Done, проверить вашу базу данных в настоящее время.

Смежные вопросы