언어/파이썬 & 장고
-
[Python] 실수를 사칙연산할 때 주의점언어/파이썬 & 장고 2020. 12. 20. 16:43
최근 값을 계산하는 로직을 개발하면서 기본적이지만 까먹고 있었던 부분에서 애를 먹었습니다. 파이썬에서는 실수 (유리수 + 무리수)를 부동 소수점으로 표현하기 때문에 소수점이 있는 계산에서 우리가 생각하고 있는 것과 약간 다르게 동작합니다.예시아래는 0.1 + 0.2를 연산하는 로직입니다. 해당 연산의 결과는 0.3으로 보통 생각하고 있지만 파이썬의 결과는 다르게 나옵니다.print(0.1+0.2) ## 0.30000000000000004 컴퓨터에서는 숫자를 비트로 표현하는데 실수의 경우 유리수 + 무리수 이기 때문에 정확한 표현이 어렵습니다. 그래서 제한적인 비트를 사용하여 근삿값을 표현하기 때문에 0.3의 근삿값인 0.30000000000000004이 나오게 되고 0.1 + 0.2 == 0.3 을 하면..
-
[Python] re 모듈 사용법언어/파이썬 & 장고 2020. 7. 25. 22:53
regex는 정규 표현식으로 흔히 알려져 있습니다. 파이썬에서 정규 표현식을 사용할 때, 내장 모듈인 re를 사용하고 있습니다. re 모듈에서 제공해주는 함수들을 보면 match(), fullmatch(), findall(), search() 등등이 있는데 어떤 함수를 사용하냐에 따라 결과가 달라지게 됩니다. 여기서는 정규 표현식에 대한 기본부터 설명하는 것이 아닌, 파이썬의 re 모듈에서 제공하는 함수의 쓰임새를 예제와 함께 설명하여 사용자의 목적에 맞게 사용할 수 있도록 설명합니다.왜 정규 표현식을 쓸까?파이썬에서는 문자열에서도 기본적으로 특정 문자 또는 문자열이 존재하는지나 어느 위치에 있는지와 같은 기능을 제공합니다.'123' in 'abc123def' # True s = 'foo123bar' s..
-
[Django] Channels 란?언어/파이썬 & 장고 2020. 7. 22. 20:21
Django 3.0 에서 Channels 기능을 제공하는데 Channels은 ASGI를 기반으로 만들어진 프로젝트입니다. 기존의 HTTP 통신을 넘어서 웹 소켓, 채팅 프로토콜, IoT 프로토콜 등을 처리할 수 있습니다. 장고의 핵심을 그대로 따오고 계층화 시켜서 장고는 동기로 실행하지만 기타 connection과 socket을 비동기적으로 처리할 수 있도록 합니다. 또한 동기, 비동기 모드를 선택할 수도 있습니다.ASGI란?ASGI는 Asynchronous Server Gateway Interface의 약어이며 Django 3.0부터 지원하는 새로운 기능으로 비동기 웹서버 및 어플리케이션을 만들 수 있도록 제공합니다. Django 3.0부터는 ASGI를 주로 지원하는 형태를 볼 수 있습니다.WSGI의 ..
-
[Python] Selenium과 BeautifulSoup4를 사용해 네이버 검색 결과 크롤링하기언어/파이썬 & 장고 2020. 5. 27. 20:40
[Python] Selenium과 BeautifulSoup4를 사용해 네이버 카페 검색 결과 크롤링하기 에서는 네이버 카페를 타게팅하여 크롤링 하는 방법을 소개했다면 여기서는 네이버 검색 결과를 크롤링 하는 방법을 소개합니다.코드 실행 환경이나 사전 설치의 설명은 위 게시글 첫 문단에서 확인할 수 있습니다.네이버 검색 결과 크롤링하기from bs4 import BeautifulSoup from selenium import webdriver from urllib import parse options = webdriver.ChromeOptions() # options.add_argument('headless') chrome_driver = webdriver.Chrome('chrome/chromedriver'..
-
[Python] Selenium과 BeautifulSoup4를 사용해 네이버 카페 검색 결과 크롤링하기언어/파이썬 & 장고 2020. 5. 26. 21:03
네이버 카페에 원하는 키워드를 입력해 검색하고, 해당 검색 결과 리스트를 크롤링하는 방식을 설명합니다. 크롤링 사이트는 네이버 카페 중고나라를 타겟으로 합니다.selenium과 beautifulsoup 모듈을 사용하고 웹드라이버는 Phantom JS가 아닌 chromedriver의 headless 모드를 사용하여 로 진행합니다. chromedriver를 받으실 때, chrome://settings/help 에서 현재 설치된 크롬의 버전과 동일한 드라이버를 다운 받으셔야 시작부터 막히지 않습니다.selenium과 beautifulsoup 사용법은 아래 정리된 게시물을 확인하시면 도움이 됩니다.[Python] Selenium 사용하기 (+PhantomJS)[Python] BeautifulSoup 사용하기버전..
-
[Python] URL 인코딩 (퍼센트 인코딩) - urllib 사용하기언어/파이썬 & 장고 2020. 5. 10. 00:18
URL (퍼센트) 인코딩이란?URL 인코딩은 퍼센트 인코딩이라고도 불리며 URL에 문자를 표현하는 문자 인코딩 방법입니다. 알파벳이나 숫자 등 몇몇 문자를 제외한 나머지는 1바이트 단위로 묶인 16진수로 인코딩하는 방식입니다.불곰→ url encode%EB%B6%88%EA%B3%B0왜 해야 하는가GET 방식을 통해 HTTP 요청을 할 때 쿼리 파라미터가 붙는 경우가 생기는데 URL은 ASCII 코드값만 사용됩니다. 이 쿼리 파라미터에 한글이 포함될 경우, ASCII 코드만으로 표현을 할 수 없어서 인코딩을 진행해야 합니다. 호출하는 API마다 쿼리 파라미터에 한글 문자 그대로를 지원하는 경우도 있지만 그렇지 않은 경우도 있으므로 미리 인코딩을 거친 형식으로 전송하는 것이 바람직합니다.url encode파..
-
[Django] OuterRef, Subquery 사용할 때, .count() 오류 해결법언어/파이썬 & 장고 2020. 4. 27. 20:02
Select 절에 inner 쿼리 형태를 만들고 inner 쿼리의 결과로 count를 세고자 할 때 아래와 같은 쿼리를 짤 수 있습니다.SELECT id, title, (SELECT COUNT(tag.id) AS count FROM tag INNER JOIN post ON (post.id = tag.id) GROUP BY tag.id ) AS "count" FROM post 이러한 형태를 ORM으로 변형하면 다음과 같은 형태로 표현할 수 있습니다.from django.db import models from django.db.models import OuterRef, Subquery class Tag(models.Model): name = models.CharField(max_length=120) clas..
-
[Python] string concat vs list join 속도 비교언어/파이썬 & 장고 2020. 3. 8. 01:35
특정 템플릿에 문자를 매치 시킨 후, 해당 결과를 계속 더해 나가는 코드를 짜던 중, 방법은 여러가지인데 어떤게 속도가 더 빠를 지 궁금해서 비교를 해봤습니다.배경작업ES에 벌크로 호출할 데이터를 만들기 위해 아래와 같은 형태가 필요했습니다.POST _bulk {"update": {"_index": "product", "_type":"product", "_id":0}} {"doc": {"price":0, "margin": 0}} {"update": {"_index": "product", "_type":"product", "_id":0}} {"doc": {"price":0, "margin": 0}} .... {"update": {"_index": "product", "_type":"product", "_i..
-
[Django] ORM에서 Func()를 사용해 커스텀 DB 함수 구현하기언어/파이썬 & 장고 2020. 3. 7. 20:22
장고 ORM에서는 데이터베이스의 함수를 다수 지원합니다. 하지만 전부를 지원하는 것이 아니여서 지원하지 않는 함수를 쓸 땐, DB에서 데이터를 받아온 다음 파이썬 코드를 작성해야 합니다. 여기서는 Func()를 사용해 장고에서 지원하지 않는 DB 함수를 구현합니다. 먼저 장고에서는 pg의 unnest라는 기능을 제공하고 있지 않습니다. unnest는 어레이 타입의 컬럼 데이터를 인덱스 별로 각 row로 분리시켜주는 기능입니다. 데이터가 {1,2,3} 이렇게 1개의 row로 되어 있다면 unnest를 사용하여 3개의 row로 표현할 수 있습니다. (각 row는 1, 2, 3 으로 3개의 row)from django.db.models import Func temp = Test.objects.annotate(..
-
[Django] array_agg, string_agg, unnest ORM으로 구현하기언어/파이썬 & 장고 2020. 3. 7. 18:38
PostgreSQL에서 지원하는 array나 string 타입의 함수를 장고에서도 일부 지원을 합니다. 예를 들어, array 타입 함수의 unnest나 여러 row를 array로 변형하는 함수 등을 구현할 수 있습니다. 이러한 기능을 잘 사용하면 DB에서 가져온 데이터를 파이썬 코드로 반복문을 돌면서 형태를 변환하는 수고를 줄일 수 있습니다. 여기서는 복수 row를 가지는 컬럼을 단일 array로 만들거나 구분자를 주어 string 타입으로 변형하는 예시입니다.먼저 테이블 내 컬럼은 아래와 같습니다.testabc11223가나다array_aggfrom django.contrib.postgres.aggregates import ArrayAgg temp = Test.objects.aggregate( test..