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には、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
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ドキュメント
ライブラリを使用する場合、csv
とDjango
をグーグルですばやく検索すると、2つのライブラリが表示されます- Django-csvimport と Django-adaptors =。彼らが彼ら自身について言っていることを読んでみましょう...
Djangoアダプターは、CSV/XMLファイルをpythonオブジェクトまたはDjangoモデルインスタンスに簡単に変換できるツールです。
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を介して対話的に行うことができます。次に-ライブラリを使用することにした場合は、ニーズに合ったものを見つけてみてくださいニーズ。
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
Python csv library は解析を行い、コードはそれらをProducts()
に変換できます。
このようなもの:
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()
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
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")
これにより、製品が自動的に作成されます。
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
完了、今すぐデータベースを確認してください。
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( ';')メソッドによって処理されませんでした.
パンダには非常に多くの有用な警告があり、知る価値があります
Django Egg for it:
Djangoの組み込みデシリアライザーの使用を検討してください。 Djangoの docs はよく書かれており、開始に役立ちます。データをcsvからXMLまたはJSONに変換し、デシリアライザーを使用してデータをインポートすることを検討してください。これを(Webリクエストではなく)コマンドラインから実行している場合、loaddata
manage.pyコマンドが特に役立ちます。
Django-import-export を試すことができます。素敵な管理統合、変更プレビュー、オブジェクトの作成、更新、削除が可能です。
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]としてアクセスできます。