web-dev-qa-db-fra.com

comment importer des données csv dans des modèles Django

J'ai des données CSV et je souhaite importer dans des modèles Django en utilisant l'exemple de données 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";

J'ai des modèles Django nommés Product. Dans Product, il y a des champs comme name, description et price. Je veux quelque chose comme ça :

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

Vous souhaitez utiliser le module csv qui fait partie du langage python et vous devez utiliser la méthode get_or_create de 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

Dans mon exemple, l'enseignant modèle a trois attributs first_name, last_name et middle_name.

Documentation Django de méthode get_or_create

67
Friendm1

Si vous souhaitez utiliser une bibliothèque, une recherche rapide sur Google pour csv et Django révèle deux bibliothèques - Django-csvimport et Django-adapters =. Lisons ce qu'ils ont à dire sur eux-mêmes ...

  • Adaptateurs Django :

L'adaptateur Django est un outil qui vous permet de transformer facilement un fichier CSV/XML en un objet python ou une instance de modèle Django).

  • Django-importcsv :

Django-csvimport est un outil d'importation générique pour permettre le téléchargement de fichiers CSV pour le remplissage des données.

Le premier vous oblige à écrire un modèle pour correspondre au fichier csv, tandis que le second est plus un importateur de ligne de commande, ce qui est une énorme différence dans la façon dont vous travaillez avec eux, et chacun est bon pour un type de projet différent.

Alors lequel utiliser? Cela dépend de celui qui conviendra le mieux à votre projet à long terme.

Cependant, vous pouvez également éviter complètement une bibliothèque, en écrivant votre propre Django script pour importer votre fichier csv, quelque chose dans le sens de (avertissement, pseudo-code à venir ):

# 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 

C'est super simple. Enfer, vous pouvez le faire de manière interactive via le shell Django s'il s'agit d'une importation unique. Déterminez simplement ce que vous voulez faire avec votre projet, combien de fichiers vous devez gérer et alors - si vous décidez d'utiliser une bibliothèque, essayez de trouver celle qui convient le mieux vos besoins.

26
yuvi

Vous pouvez également utiliser, Django-adapters

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

Vous déclarez un MyCsvModel qui correspondra à un fichier CSV comme celui-ci:

Anthony; 27; 1,75

Pour importer le fichier ou tout objet itérable, faites simplement:

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

Sans déclaration explicite, les données et les colonnes sont mises en correspondance dans le même ordre:

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

Le Python bibliothèque csv peut faire votre analyse et votre code peut les traduire en Products().

8
msw

quelque chose comme ça:

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
DrDee

Pour Django 1.8 que j'utilise,

J'ai fait une commande que vous pouvez créer des objets dynamiquement à l'avenir, donc vous pouvez simplement mettre le chemin du fichier du csv, le nom du modèle et le nom de l'application de l'application Django, et remplira le modèle pertinent sans spécifier les noms de champs. donc si nous prenons par exemple le prochain csv:

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

il créera les objets [{field1: value1, field2: value2, field3: value3}, {field1: value11, field2: value22, field3: value33}] pour le nom de modèle que vous saisirez pour la commande.

le code de commande:

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)

notez que peut-être dans les versions ultérieures

from Django.db.models.loading import get_model

est obsolète et doit être remplacé par

from Django.apps.apps import get_model
5
DorZ

Vous pouvez utiliser le package importateur Django-csv. http://pypi.python.org/pypi/Django-csv-importer/0.1.1

Cela fonctionne comme un modèle Django

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

    class Meta:
        delimiter = ";"
        dbModel = Product

Et il vous suffit de: CsvModel.import_from_file ("mon fichier")

Cela créera automatiquement vos produits.

4
trez

Si vous travaillez avec de nouvelles versions de Django (> 10) et que vous ne voulez pas passer du temps à écrire la définition du modèle. Vous pouvez utiliser l'outil ogrinspect.

Cela créera une définition de code pour le modèle.

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

La sortie sera la définition de classe (modèle). Dans ce cas, le modèle sera appelé Produit . Vous devez copier ce code dans votre fichier models.py.

Ensuite, vous devez migrer (dans le Shell) la nouvelle table Product avec:

python manage.py makemigrations
python manage.py migrate

Plus d'informations ici: https://docs.djangoproject.com/en/1.11/ref/contrib/gis/tutorial/

Notez que l'exemple a été fait pour les Shapefiles ESRI mais cela fonctionne aussi très bien avec les fichiers CSV standard.

Pour ingérer vos données (au format CSV), vous pouvez utiliser des 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()

Maintenant, chaque ligne doit être transformée en dictionnaire et utiliser ce dict pour instancier votre modèle (dans ce cas, Product ())

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

Terminé, vérifiez votre base de données maintenant.

2
Juan

Utilisez la bibliothèque Pandas pour créer une trame de données des données csv.
Nommez les champs en les incluant dans la première ligne du fichier csv ou dans le code en utilisant la méthode des colonnes de la trame de données.
Créez ensuite une liste d'instances de modèle.
Enfin, utilisez la méthode Django . Bulk_create () pour envoyer votre liste d'instances de modèle à la table de base de données.

La fonction read_csv dans pandas est idéale pour lire les fichiers csv et vous donne beaucoup de paramètres pour sauter les lignes, omettre les champs, etc.

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)

J'utilisais la réponse de mmrs151 mais l'enregistrement de chaque ligne (instance) était très lent et tous les champs contenant le caractère de délimitation (même à l'intérieur des guillemets) n'étaient pas traités par la méthode open () - line.split (';').

Les pandas ont tellement de mises en garde utiles, il vaut la peine de savoir

2
Erik

Voici un Django oeuf pour cela:

Django-csvimport

1
andy boot

Pensez à utiliser les désérialiseurs intégrés de Django. Django's docs sont bien écrits et peuvent vous aider à démarrer. Pensez à convertir vos données de csv en XML ou JSON et à utiliser un désérialiseur pour importer les données. Si vous effectuez cette opération à partir de la ligne de commande (plutôt que via une demande Web), la commande loaddata manage.py sera particulièrement utile.

1
Dave

Vous pouvez essayer Django-import-export . Il a une intégration d'administration Nice, un aperçu des modifications, peut créer, mettre à jour, supprimer des objets.

1
r_black

définir la classe dans models.py et une fonction dedans.

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

Vous pouvez accéder au ième élément de la liste en tant qu'éléments [i]

1
Pratik Gujarathi