복붙노트

[PYTHON] 장고 모델로 csv 데이터를 가져 오는 방법

PYTHON

장고 모델로 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";

나는 Product라는 Django 모델을 가지고있다. 제품에는 이름, 설명 및 가격과 같은 몇 가지 필드가 있습니다. 나는 이런 것을 원한다.

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

    1.파이썬 언어의 일부인 csv 모듈을 사용하기를 원하며 Django의 get_or_create 메소드를 사용해야합니다.

    파이썬 언어의 일부인 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이라는 세 가지 속성을가집니다.

    get_or_create 메소드에 대한 장고 문서

  2. ==============================

    2.라이브러리를 사용하려면 csv 및 django에 대한 빠른 Google 검색을 통해 django-csvimport 및 django-adapters라는 두 개의 라이브러리가 나타납니다. 자기가하는 말을 읽어 봅시다 ...

    라이브러리를 사용하려면 csv 및 django에 대한 빠른 Google 검색을 통해 django-csvimport 및 django-adapters라는 두 개의 라이브러리가 나타납니다. 자기가하는 말을 읽어 봅시다 ...

    첫 번째 방법은 csv 파일과 일치하는 모델을 작성해야하지만 두 번째 방법은 명령 행 가져 오기 도구를 사용하는 것입니다.이 방법은 사용자가 작업하는 방식에 큰 차이가 있으며 각기 다른 유형의 프로젝트에 유용합니다.

    그래서 어느 것을 사용할 것인가? 그 중 어느 것이 장기적으로 프로젝트에 더 잘 맞는지에 따라 다릅니다.

    그러나 csv 파일을 가져 오는 자신의 django 스크립트를 작성하여 (경고, 의사 코드 앞) 다음 줄을 따라 라이브러리를 모두 피할 수도 있습니다.

    # 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 
    

    그것은 아주 쉽다. 지옥, 당신은 한 번 가져 오기 경우 장고 껍질을 통해 그것을 대화 형으로 할 수 있습니다. 프로젝트로 무엇을하고 싶은지, 몇 개의 파일을 처리해야하는지, 그리고 라이브러리를 사용하기로 결정했다면, 어느 것이 더 적합한 지 파악해보십시오.

  3. ==============================

    3.Python CSV 라이브러리는 구문 분석을 수행 할 수 있으며 코드는 Products ()로 변환 할 수 있습니다.

    Python CSV 라이브러리는 구문 분석을 수행 할 수 있으며 코드는 Products ()로 변환 할 수 있습니다.

  4. ==============================

    4.django-adapter를 사용할 수도 있습니다.

    django-adapter를 사용할 수도 있습니다.

    >>> 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
    
  5. ==============================

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

    6.django-csv-importer 패키지를 사용할 수 있습니다. http://pypi.python.org/pypi/django-csv-importer/0.1.1

    django-csv-importer 패키지를 사용할 수 있습니다. 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 ( "내 파일")

    그러면 제품이 자동으로 생성됩니다.

  7. ==============================

    7.내가 사용하는 장고 1.8의 경우,

    내가 사용하는 장고 1.8의 경우,

    나는 당신이 미래에 동적으로 객체를 생성 할 수 있다는 명령을 내렸지 만, 그래서 당신은 csv의 파일 경로, 모델 이름, 관련 django 응용 프로그램의 응용 프로그램 이름을 넣을 수 있으며 필드 이름을 지정하지 않고 관련 모델을 채 웁니다. 예를 들어 다음 csv :

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

    객체를 생성합니다. [{필드 1 : 값 1, 필드 2 : 값 2, 필드 3 : 값 3}, {필드 1 : 값 11, 필드 2 : 값 22, 필드 3 : 값 33} 명령에 입력 할 모델 이름을 입력하십시오.

    명령 코드 :

    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
    
  8. ==============================

    8.다음은 장고 달걀입니다.

    다음은 장고 달걀입니다.

    장고 - csvimport

  9. ==============================

    9.장고에 내장 된 디시리얼라이저의 사용을 고려하십시오. Django의 문서는 잘 작성되어 있으며 시작하는 데 도움이 될 수 있습니다. 데이터를 csv에서 XML 또는 JSON으로 변환하고 데시리아 이어를 사용하여 데이터를 가져 오는 것이 좋습니다. 웹 요청이 아닌 명령 줄에서이 작업을 수행하는 경우 loaddata manage.py 명령이 특히 유용합니다.

    장고에 내장 된 디시리얼라이저의 사용을 고려하십시오. Django의 문서는 잘 작성되어 있으며 시작하는 데 도움이 될 수 있습니다. 데이터를 csv에서 XML 또는 JSON으로 변환하고 데시리아 이어를 사용하여 데이터를 가져 오는 것이 좋습니다. 웹 요청이 아닌 명령 줄에서이 작업을 수행하는 경우 loaddata manage.py 명령이 특히 유용합니다.

  10. ==============================

    10.Pandas 라이브러리를 사용하여 csv 데이터의 데이터 프레임을 만듭니다. csv 파일의 첫 번째 줄 또는 코드에서 데이터 프레임의 columns 메서드를 사용하여 필드의 이름을 지정합니다. 그런 다음 모델 인스턴스 목록을 작성하십시오. 마지막으로 django 메서드 인 .bulk_create ()를 사용하여 모델 인스턴스 목록을 데이터베이스 테이블로 보냅니다.

    Pandas 라이브러리를 사용하여 csv 데이터의 데이터 프레임을 만듭니다. csv 파일의 첫 번째 줄 또는 코드에서 데이터 프레임의 columns 메서드를 사용하여 필드의 이름을 지정합니다. 그런 다음 모델 인스턴스 목록을 작성하십시오. 마지막으로 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 ( ';') 메서드에 의해 처리되지 않았습니다.

    판다에는 많은 유용한 경고가 있습니다. 알아 둘 가치가 있습니다.

  11. ==============================

    11.django-import-export를 시도해 볼 수 있습니다. 그것은 좋은 관리자 통합, 미리보기 변경, 생성, 업데이트, 삭제 개체 수 있습니다.

    django-import-export를 시도해 볼 수 있습니다. 그것은 좋은 관리자 통합, 미리보기 변경, 생성, 업데이트, 삭제 개체 수 있습니다.

  12. ==============================

    12.당신이 장고 (> 10)의 새로운 버전을 사용하고 있고 모델 정의를 작성하는데 시간을 낭비하고 싶지 않다면. ogrinspect 도구를 사용할 수 있습니다.

    당신이 장고 (> 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 Shapefiles에 대해 수행되었지만 표준 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
    

    지금 데이터베이스를 확인하십시오.

  13. ==============================

    13.models.py에 클래스를 정의하고 그 안에 함수를 정의하십시오.

    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]

  14. from https://stackoverflow.com/questions/2459979/how-to-import-csv-data-into-django-models by cc-by-sa and MIT license