web-dev-qa-db-ja.com

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モデルがあります。Productには、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
56
little_fish

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の3つの属性があります。

get_or_createメソッド のDjangoドキュメント

67
Friendm1

ライブラリを使用する場合、csvDjangoをグーグルですばやく検索すると、2つのライブラリが表示されます- Django-csvimportDjango-adaptors =。彼らが彼ら自身について言っていることを読んでみましょう...

  • ジャンゴアダプター

Djangoアダプターは、CSV/XMLファイルをpythonオブジェクトまたはDjangoモデルインスタンスに簡単に変換できるツールです。

  • Django-importcsv

Django-csvimportは、データを取り込むためのCSVファイルのアップロードを可能にする汎用インポーターツールです。

1つ目は、csvファイルに一致するモデルを記述する必要があり、2つ目は、コマンドラインインポーターであり、の大きな差あなたが彼らと働く方法、そしてそれぞれが異なるタイプのプロジェクトに適しています。

どちらを使用するのですか?それは、長期的にはどちらがプロジェクトに適しているかによります。

ただし、 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 

とても簡単です。地獄、1回限りのインポートである場合は、Django Shellを介して対話的に行うことができます。次に-ライブラリを使用することにした場合は、ニーズに合ったものを見つけてみてくださいニーズ

26
yuvi

Django-adaptors を使用することもできます

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

次のようなCSVファイルに一致するMyCsvModelを宣言します。

アンソニー; 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
mmrs151

Python csv library は解析を行い、コードはそれらをProducts()に変換できます。

8
msw

このようなもの:

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

Django 1.8が使用している場合、

将来的にオブジェクトを動的に作成できるコマンドを作成したため、csvのファイルパス、関連するDjangoアプリケーションのモデル名、アプリ名、フィールド名を指定せずに関連するモデルを作成します。たとえば、次のcsvを使用した場合:

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

コマンドに入力するモデル名のオブジェクト[{field1:value1、field2:value2、field3:value3}、{field1:value11、field2:value22、field3:value33}]を作成します。

コマンドコード:

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

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( "my file")

これにより、製品が自動的に作成されます。

4
trez

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

完了、今すぐデータベースを確認してください。

2
Juan

Pandas library を使用して、csvデータのデータフレームを作成します。
csvファイルの最初の行にデータフィールドを含めるか、データフレームの列メソッドを使用してコードにフィールドの名前を付けます。
次に、モデルインスタンスのリストを作成します。
最後に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( ';')メソッドによって処理されませんでした.

パンダには非常に多くの有用な警告があり、知る価値があります

2
Erik

Django Egg for it:

Django-csvimport

1
andy boot

Djangoの組み込みデシリアライザーの使用を検討してください。 Djangoの docs はよく書かれており、開始に役立ちます。データをcsvからXMLまたはJSONに変換し、デシリアライザーを使用してデータをインポートすることを検討してください。これを(Webリクエストではなく)コマンドラインから実行している場合、loaddata manage.pyコマンドが特に役立ちます。

1
Dave

Django-import-export を試すことができます。素敵な管理統合、変更プレビュー、オブジェクトの作成、更新、削除が可能です。

1
r_black

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番目の要素には、items [i]としてアクセスできます。

1