Python 140

why use namedtuple

namedtuple이란게 있다. from collections import namedtuple mynamedtuple = namedtuple("mynamedtuple", ["field1", "field2"]) print mynamedtuple('field1', 2222) 이런식으로 쓰는데 저걸보고 든 생각이.. 굳이 저 namedtuple을 쓰는것보다 딕셔너리나, 복잡해지면 클래스로 간단하게 정의하면 되지 않을까? 생각해서 관련 글을 찾아봤었는데 좋은 글을 찾아서 번역한다. https://stackoverflow.com/questions/9872255/when-and-why-should-i-use-a-namedtuple-instead-of-a-dictionary 의 첫번째 답에서 유용한 부분만 가져온다...

remove docker image over 2 month

로컬에서 테스트로 도커 빌드를 자주 해보는데 이미지가 계속 쌓인다. 이미지를 계속해서 만들다보면 도커의 이미지를 저장하는곳의 공간이 풀나서 정말 몇개월에 한번씩 이미지를 더이상 생성할수 없다고 나오는데 2달이 지난 이미지는 필요없다고 판단해 지우는 스크립트를 하나 만들었다. 여기에 저장해놓고 가져다가 쓰려고 간단하게 만들어둠. python3 import subprocess import re def get_docker_image_list(name): docker_image_list, _ = subprocess.Popen(['docker', 'image', 'ls'], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() docker_image_lis..

selenium cron to text

cron포맷을 영어 텍스트로 변환해야 할 일이 생겼다. 그러니까 예로 * * * * * 같은 경우 every minute 같은거로. 구글링을 하니 아예 파이썬 전용 pip라이브러리가 있다. 한 3개정도 찾았는데 ex) https://pypi.org/project/cron-descriptor/ 크론 구문이 복잡해지면 얘가 잘 파싱하지를 못한다.(얘말고도 다른것들도 한가지씩 문제가 있었다.) 문제되는 케이스 예시.(에러 발생) # -*- coding: utf-8 -*- from cron_descriptor import get_description, ExpressionDescriptor print(get_description("3 0-3,7-23/3 * * *")) 실제로 크론탭 작업시에는 https://cr..

Python/2.7 for fun. 2019.12.05

json.loads 에러시 위치 찾는 방법 꿀팁

https://stackoverflow.com/questions/19519409/how-to-get-error-location-from-json-loads-in-python 의 내용을 가져옴. 정규식으로 소스 코드 안의 api의 결과값으로 보이는 json을 파싱하는 프로그램을 만들었다고 가정해보자. api의 결과값을 잘 가져온것 같은데 json.loads로 파싱해보면 에러가 나는 경우가 많다. 예로.. import json s = r'[{"prodNo":374834551334,"prodNm":"나주곰탕 600g x 8인분","saleStatus":"A","salePrice":12500,"discountYn":"N","discountPrice":0,"optUseYn":"N","optTextList":[],..

dictionary 예쁘게 출력하기 + 한글 그대로 출력

특정 사이트에서 api를 사용해서 어떤 정보를 가져올 경우 요즘은 대부분 json의 형태로 결과가 나온다. 그 정보를 가져다가 써야 할 경우에 json.loads같은거로 딕셔너리로 가져와서 쓰는데, api결과값의 구조가 많이 복잡할 경우 분석해서 프로그래밍을 하기가 힘들다. (특정 값이 딕셔너리의 3,4단 안에 있을 경우 키를 찾아서 들어가기가 어렵다는 말. 또는 눈으로 볼수 없어 구조 분석이 힘들다는 말.) 예를 들면 혼자서 하는 프로젝트를 하려고 어떤 쇼핑몰 사이트에서 상품정보를 가지고와서 사용하려고 하는데 api의 결과값이 복잡한 경우가 있다. api의 결과값이 복잡할 경우 쇼핑몰의 상품정보를 가지고 오려고 하는데 그 상품정보가 딕셔너리의 어디의 어디를 찾아서 들어가야하는지도 복잡하고, json.l..

timezone 설정 모듈.

ec2로 구성된 k8s에서 데이터 파이프라인을 만들었다. 1시간마다 주기적으로 실행하면, 현재 시간 -1시간 0분 ~ 현재 시간 0분(그러니까 1시간 이전의 데이터)의 데이터를 가져와서 작업을 한다. 로컬에서 잘 동작하는걸 보고 서버에 올렸는데 잘 되지 않았다. 원인파악을 해보니 ec2의 timezone이 UTC로 되어있어서 한국시간기준으로 -9시간으로 돌아가고 있어서 그런거였다. 귀찮아서 그냥 현재시간 + 9시간 으로 계산하려다가.... 이렇게 해결하는건 뭔가 아닌것같아서 모듈을 찾았다. https://technote.kr/202 pytz라는 모듈인데 여기 아주 잘 설명되어있다. from datetime import datetime, timedelta from pytz import timezone t_..

python re search with newline

html에서re 모듈로 searching을 할때가 있다. 근데 html내부에 여러가지 js함수가 있고 그중에 특정 함수 안에있는 값을 찾으려고 한다. 예로 이런 경우. s = ''' def rara(): asldkfjawefjaiwef def function(): rara sdfjowefiowe~ var = 'value' sadflwjeo;fijwoefs def zozo(): 2wefoiawjofewf ''' 여기서 function이라는 함수 내부의 var값을 가져오려고 할때 중간에 rara sdf~이런것들은 다 무시하고자 한다. 단순히 var라는 변수가 하나뿐이면 "var\s+=\s+'(.*?)'"같은 정규식으로 써도 되지만 혹시 모르므로 def funtion():다음에 첫번째로 나오는 var = 이후..

파일 옮기는 꿀팁. (SimpleHTTPServer)

회사에서 특정 상황 때문에 repository에 접속이 안될 경우가 있다. 외부 네트워크가 갑자기 안된다거나..내가 원하는 파일을 다른 동료가 갖고 있을 수도 있는데 동료의 파일을 갖고 오려면 고전적인 usb같은거로 옮기던지.. 아니면 파일 보내는 프로그램을 사용한다던지.. 할수 있다. 하지만 usb등 이동식 디스크가 없거나 파일 보내는 프로그램을 깔기가 귀찮은 상황이면 python의 기본 모듈을 이용해서 보낼 수도 있다. 회사 안이니 같은 네트워크 안이라고 가정하고, 내가 보내야 하는 파일이 있는 디렉터리로 들어간다.그리고 python -m SimpleHTTPServer 명령어로 간단한 http server를 열 수 있다. 그러면 웹서버가 실행되는데.. 동료가 내 아이피를 알고있다면 웹서버 들어와서 파..

general function for multiprocessing

코딩을 하다 보면 특정 클래스의 특정 함수를 멀티프로세스로 돌려야할 경우가 생긴다. 매번 그냥 main안에 프로세스를 만들고 start()를 하고, join까지 넣었는데 이것들을 예쁘게 감싸줄 필요성을 느껴서 만들었다. # -*- coding: utf-8 -*- from multiprocessing import Process import time class MultiProcessTest: # example_function을 multiprocessing으로 돌리고 싶다. def example_function(self, kwargs): ps_order = kwargs['order'] parameter = kwargs['parameter'] while True: print '{} {} in example fu..

flatten list of lists

https://stackoverflow.com/questions/11264684/flatten-list-of-lists/11264799 참고. 리스트안에 리스트가 있을 경우 flatten시키고 싶은 경우가 있다. [[1], [2,3], [4,5,6], [7,8,9,10]] -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 예전에 numpy를 한번 봤었을때 https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.ndarray.flatten.html 같이 특정 함수가 있을줄 알았는데, list comprehension을 사용해서 flatten이 가능하다. 파이썬에는 flatten에 관련된 표준 함수가 없다고 하는 그 이유는 여기에 나..

파이썬 숫자를 3자리씩 끊어서 출력하기.

1000같은 숫자를 1,000처럼 출력해야 하는데 뭔가 format이 있을것같았다. 그래서 간단하게 구글링을 해봤는데... 단순히 format으로 출력하는거 말고 별 이상한 방법들이 다 있었다. 답변들이 흥미로워서 링크를 공유해 봄... https://stackoverflow.com/questions/1823058/how-to-print-number-with-commas-as-thousands-separators 재밌는 답변 두개만 가져와봄.. 가장 복잡하며 가독성 제로의 답변. >>> import itertools >>> s = '-1234567' >>> ','.join(["%s%s%s" % (x[0], x[1] or '', x[2] or '') for x in itertools.izip_longest..

Python/2.7 for fun. 2018.08.13

crontab으로 프로그램 돌릴시 주의할점, 자세한 에러 출력법

로컬에서 잘 돌아가는데 crontab 에 올리면 계속 죽는 프로그램이 있었다. try: 1/0 except Exception, e: error = str(e) # ... 에러를 슬랙으로 쏴줌. 이처럼 에러를 처리하고 있는데 저처럼 에러를 처리하면 정확하게 안 나온다. 서버에서 돌리는데 슬랙으로 '[Errno 32] Broken pipe' 만 왔다. 구글링을 해봐도 딱히 결과를 찾을수 없었다... 일단 에러를 정확하게 출력하기 위해 구글링을 더 했고, 아래처럼 수정했다. import sys try: 1/0 except: exc_info = sys.exc_info() error = traceback.format_exc() # ... 에러를 슬랙으로 쏴줌. ide에서 직접 보는것처럼 아주아주 자세한 에러를 문..

파이썬으로 구글 시트 조작.

https://developers.google.com/sheets/api/quickstart/python 를 가져와서 요약했습니다. 동작 방식이나 이런것들이 잘 이해가 가지 않았는데, (처음에는 구글 시트의 문서 소유자가 api를 쓰게해주는 권한을 열고? 파이썬에서 그걸 받아와서 사용하는줄 알았다.) 동작을 간단하게 설명하자면 내가 만든 파이썬 프로그램이 '내 구글 계정의 권한'을 가지고 내가 엑세스할수 있는 구글시트를 들어가서 값을 읽거나 편집하는 방식이다. 설명이 상당히 잘 되어있는데 동작 방식등을 안 적어놔서 잠시 헷갈렸었다. 사용법.0. pip install --upgrade google-api-python-client 설치해줍니다.1. 위 링크의 Step 1대로 해줍니다. 2. Step 1에서 ..

python 멀티프로세스 락, 등등

최근 작업한 작은 구조. 문제. 1. 레디스 리스트 자료구조(덱) 안에 많은 데이터가 있다.(그냥 큐라고 부름) 이 데이터들을 빨리빨리 빼내와서 어떤 작업을 처리해야 한다. 2. 데이터가 중복이 있는데, 처음으로 빼낸 데이터는 어떤 작업을 처리하고, 그다음에 동일한 데이터가 나오면 그냥 버린다. 3. 데이터는 빨리빨리 빼내야 하므로 멀티프로세스로 빼낸다. 4. 데이터 중복에는 규칙이 있는데, 10개의 데이터를 빼내면 최대 3가지 데이터가 중복되서 나올 수 있다. ex) [큐 앞] 1 1 2 1 3 3 3 1 2 2 [큐 뒤] 이런식이다. 큐의 뒤에서부터 빼온다고 가정하면 2처리, 그다음 2는 버리고, 1 처리, 3 처리, 331211은 버린다. 어떻게 구조를 만들수 있을까? 1. 간단하게 멀티프로세스의 ..

크롤링시 데이터 찾는 방법 노하우.

어떤 사이트에서 크롤링을 할 경우에 다음과 같은 단계를 거친다.1. 해당 페이지를 구성하는 데이터들을 어디서 받을수 있는지 찾는다.2. 해당 페이지에 요청을 보내는 코드를 짠다.3. 페이지 정보 등을 가져온 후 (파이썬의 경우) beautifulsoup나 정규식을 이용하여 필요한 부분을 크롤링하여 자동화한다. 일정 횟수 이상 크롤링을 해본 사람들이 보기에 가장 어려운 부분은 1번 파트이다.(처음 시작하는 사람은 구현부인 2,3번이 가장 어렵다)2번이야 항상 똑같으니 됐고, 3번이야 프로그래밍 지식이나 센스만 있으면 간단하다. 하지만 1번은 우리가 데이터를 찾아야 하기에 힘들다. 그리고 api처럼 공식문서도 당연히 없다. 아래에 다양한 사례와 1번의 데이터를 조금 더 쉽게 찾을 수 있는, 또는 크롤링하는 ..

Python/2.7 for fun. 2017.08.30

전문가를 위한 파이썬 책에서 알아낸 것들..

유용할것 같은 것들 정리. 1. 리스트에서 인덱스로 엘리먼트를 가져오듯이, class에서 __getitem__을 구현해서 인덱스로 가져오게 할 수 있다. len등도 구현 가능하다. 더 찾아보면 많은게 있다. 앞에도 분명 이런글을 썼었던것 같은데... 사실 귀찮아서 안 찾아본듯 싶다. class Deck: def __init__(self): self.cards = [chr(97+i) for i in xrange(10)] def __getitem__(self, index): return self.cards[index] def __len__(self): return len(self.cards) deck = Deck() print 'len = {}'.format(len(deck)) for i in xrange(..

multiprocessing에서 여러 프로세스가 동시 변수 참조하는 문제

아주 예전의 http://qkqhxla1.tistory.com/15 포스팅에서 언급했듯이 여러개의 쓰레드나 프로세스에서 한 데이터에 그냥 접근하면 문제가 생긴다. 오늘 프로그래밍을 하는데, 멀티프로세싱으로 여러개의 데이터를 동시에 한 리스트에 넣는 프로그램을 짰었다. 멀티프로세싱으로 동시에 한 값을 바꾸는건 문제가 되는걸 알고있었는데, 집어넣는게 문제가 될줄은 몰랐다. 바빠서 왜 이게 문제가 되는지는 아직 찾아보지 못했는데, print로 출력해 본 결과 글로벌한 리스트 하나에 값이 들어가는게 아니라 프로세스마다 각각의 리스트가 있어서 각각의 리스트에 들어가는것처럼 출력이 되었다. 그리고 아래 글은 그 이후에 삽질한 일부 내용을 정리한 글이다. 첫번째로 세마포어를 찾아보려고 하였다. 위의 포스팅의 쓰레드 ..

파이썬 정규식 한글.

http://jokergt.tistory.com/52 에서 그대로 가져왔습니다. (문제시 삭제하겠습니다.) 파이썬에서 한글만 추출하는 정규식. # -*- coding: utf-8 -*- import re s='韓子는 싫고, 한글은 nice하다. English 쵝오 -_-ㅋㅑㅋㅑ ./?!' hangul = re.compile('[^ ㄱ-ㅣ가-힣]+') # 한글과 띄어쓰기를 제외한 모든 글자 # hangul = re.compile('[^ \u3131-\u3163\uac00-\ud7a3]+') # 위와 동일 result = hangul.sub('', s) # 한글과 띄어쓰기를 제외한 모든 부분을 제거 print (result) result = hangul.findall(s) # 정규식에 일치되는 부분을 리스트..

비동기 처리 관련.(python 3)

사실 비동기에 대해서는 자바스크립트의 promise()만 알고 있었고, 어느정도 흐름을 파악해서 다른걸 봐도 비슷할거라 생각했다. 파이썬 3.5부터 비동기 관련 문법이 새로 나왔는데(원래 모듈에 있었는데 기본 문법으로 들어갔다), 공부하려고 docs를 보고 예제를 봐도 잘 이해가 안되서 몇일동안 삽질했었다. 사실 아직도 완전히 이해가 된 건 아니지만, 일단 지금까지 이해한 내용을 기반으로 정리.(새로운 것을 깨닫거나 틀린 지식이 있을 경우 계속 바꿔나갈 예정)사실 글을 쓰다가 발견한건데 쓸게 너무 많다. 아래의 모든 코드는 전부 아래의 참조 링크에서 가져왔습니다.(문제될시 글 삭제하겠습니다.) 3.5이하버전에서는 코루틴 문법이 아래와 같았지만 # Python 3.4 import asyncio @async..

yield from, generator(yield) vs coroutine (python 3)

1. 파이썬에서 제너레이터로 yield를 쓸수 있다. 하지만 3.3부터 yield from 이라는 구문도 생겼다. 간단하게 아래 예제처럼 여러개의 제너레이터를 리팩토링해줄수 있다고 한다.출처 : http://simeonvisser.com/posts/python-3-using-yield-from-in-generators-part-1.html # -*- coding: utf-8 -*- def generator2(): for i in range(10): yield i def generator3(): for j in range(10, 20): yield j def generator(): for i in generator2(): yield i for j in generator3(): yield j for n in..

mongo db

mongo db는 데이터를 json형태의 키:값으로 저장한다. 이러한 값의 집합을 콜렉션이라고 한다. 일반적인 db의 테이블이라고 보면 된다. python에서 pymongo를 이용해 데이터를 넣거나 빼고 조회 등을 할 수 있다. 공식 문서 : http://api.mongodb.com/python/current/tutorial.html 예시들. 1. db연결, db설정self.client = MongoClient(self.host, 27017)self.db = self.client['디비이름'] 2. db조회self.db['디비이름'].find_one({'조회할 키값?': '조회할 키값'})이처럼 json형태, 파이썬의 딕셔너리 형태로 전송해서 조회함. 3. insert, updatedoc = {'키1':..

로그 찍기.

파이썬에는 logging이라는 로그를 위한 모듈이 있다. 몇가지 자주 쓰이는 것(자주 쓰이는것처럼 보이는 것)만 적어보려고 함.. 1. logging.getLogger('이름') 으로 로그파일을 만들 수 있다. 로그라는걸 알려주기위해 .log를 확장자로 하자. 2. logging.Formatter('') 으로 로그의 형식을 지정할 수 있다. 아래 참고에 적어놓은 공식홈페이지에서 가져온 예제이다.formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')포맷이 특이하다. %(name)같은건 예약어인지 선언안하고 쓸수 있다. 저런식으로 포맷을 설정하고logger.debug('debug message')처럼 실행하면 ..

유닛테스트.

a.py가 있고 a.py안에 어떤 한 서비스를 돌리는 코드가 있다고 가정하자. a.py # -*- coding: utf-8 -*- class Service(): def service_run(self, name, age, phone_number): c = [name,age,phone_number] a = self.process(c) # 어떤 동작들을 더 해야 한다고 가정. self.get_in_db(a[0], a[1], a[2]) # db로 넣는 함수가 있다고 가정. def process(self, p): return [p[0], p[1], p[2]] def get_in_db(name, age, phone_number): # db로 넣는다고 가정. pass if __name__=='__main__': wh..

점심추천 slackbot 만들기.

https://www.fullstackpython.com/blog/build-first-slack-bot-python.html 에 전반적인 설명이 아주 잘 나와 있다. (위에 사이트 보고 한거 그대로 정리함.) 첫번째로 슬랙에 가입을 하고 로그인을 한 후 https://api.slack.com/bot-users 페이지에서 Creating a new bot user 을 눌러 새 봇을 만든다. 이름을 아무거나 입력하고 add bot integration을 누르면 사진처럼 토큰이 주어진다. 그리고 봇이 가지길 원하는 이름을 입력하고 사진 등을 업로드해서 본인의 봇을 세팅한다. 다 세팅했으면 save integration을 눌러서 저장하자. 그리고 환경변수로 봇의 api키값을 등록해놓는다.export SLACK..

Python/2.7 for fun. 2017.03.20

unittest. 테스트

unittest모듈을 사용해서 테스트를 할 수 있다. 공식 doc : https://docs.python.org/2/library/unittest.html 해야될 것들. 1. 클래스를 구현해서 테스트를 하는데, unittest.TestCase를 상속받아야 한다. 2. 테스트할 함수들의 이름은 test로 시작하도록 구현한다. 이름이 test로 시작하지 않으면 테스트가 되지 않는다. 3. self.failUnless나 self.failIf등등의 메소드를 상속받으며 이 안에 테스트할 함수를 인자로 넣는다. # -*- encoding: cp949 -*-import unittest # Here's our "unit".def IsOdd(n): return n % 2 == 1 # Here's our "unit tes..

티스토리 서비스 종료 대비용 사진 가져오기.

티스토리 서비스가 종료한다는 소문이 돌고 있다. 기사를 찾아보니 다음측에서는 서비스를 계속한다고 밝힌것 같은데 백업 기능도 종료되고, 혹시 모르니까 미리미리 서비스 종료한다는 말이 나왔을때 다른 블로그로 이동할수 있게끔 대비해놓자. 글같은경우 복붙으로 쉽게 살릴수 있지만 사진같은 경우는 복붙으로 붙여놓으면 다른 블로그에서 인식을 못한다. 다시 업로드해야되는데... 업로드를 위해서는 원본 사진이 필요하다. 대부분의 사람들이 원본 사진은 따로 저장을 안해두기에, 사진을 다시 썼던 글에서 하나하나 다운받아야 한다. 나처럼 글을 많이 쓰고 사진을 많이 넣은 사람들을 위해 모든 글의 사진을 다운받는 스크립트를 하나 만들었다. 1. 티스토리 글 읽기 구조를 주소/숫자 처럼 바꾼다. 나같은경우 첫글은 http://q..

Python/2.7 for fun. 2016.12.26

가계부 프로그램 만들기. 1차완성.

일단 기본적인 기능은 하게 완성시켰다. 처음에 만들땐 가게부? 엄청 쉬울거같은데 심심풀이로 만들어볼까? 했던 생각이... 변했다. 상당히 복잡하다. 어렵지는 않은데 복잡하다. 필요한건 그냥 gui에서 입력값을 가져와서 폴더에 보기좋게 정리하는거밖에 없다. 근데 폴더 구조를 생각하고 그러니 진짜 복잡해진다. 폴더 구조. 1. 파이썬 소스파일과 같은 폴더 안에 '가계부' 라는 이름의 폴더가 생김.2. '가계부' 폴더 안에 이번달 날짜 폴더가 생김. 오늘은 16년 12월 25일이니까 2016-12라는 폴더를 만듬. 동일한 위치에 affordable_money.txt가 있는데 이 안에는 한달동안 자유롭게 쓸수 있는 돈이 숫자로 들어가있다.3. 2016-12와 같은 폴더 안에는 3종류의 txt파일이 있다. 1) ..

Python/2.7 for fun. 2016.12.25

가계부 프로그램 만들기. (디자인만.)

개요.이제 곧 사회생활을 하는 만큼 돈 관리를 해야 한다. 캐나다에서 나름 돈 관리를 잘했었는데, 이번에도 그런 방식으로 돈을 모아보려고 한다. 근데 그때는 손으로 계산... 했었고 이제 만들면 오래쓸거 같기도 하고 재미도 있어보여서 제대로 프로그램을 만들어보기로 했다. 방법론.1. gui를 내가 원하는대로 만든다.2. 돈 관리 알고리즘을 추가한다.돈 관리 알고리즘.매달 내가 쓸수 있는 돈이 있고, 매달 쓸수 있는 돈을 4로 나눠서 1주일에 얼마 쓸수 있는지 알려준다. 돈을 썼으면 이번주에서 쓸수 있는 돈의 액수에서 차감되고, -도 될수 있다.(더 생각해봐야될듯) 만약 이번주에 쓰고 남은 돈이 있으면 데이터가 이월되듯이 다음 주의 사용가능한 액수가 그만큼 더 올라간다. 더 자세한건 만들면서 생각 예정. ..

Python/2.7 for fun. 2016.12.18

python smtp(메일보내기)

파이썬의 smtp모듈을 이용하여 메일을 보낼 수 있다. 내가 네이버 메일을 많이 쓰기에, 또 네이버는 설정이 필요해서 네이버로 메일 보내는 예제만 적었다.(구글은 설정 없이 메일 받기가 가능하다.) 1. 네이버 메일 설정. 1)메일로 들어가서 아래의 환경설정으로 들어간다. 2) 아래처럼 설정해준다. 2. 파이썬을 이용해서 내 메일로 메일을 보내 본다. 구글링해서 나온 소스코드를 사용했다. # -*- encoding: cp949 -*- import smtplib gmail_user = '본인 메일주소.' #본인 네이버 메일. asdfasfas@naver.com과 같은 형식으로 입력한다. gmail_pwd = '비밀번호' #본인 네이버 계정 비밀번호 입력. FROM = gmail_user TO = ['qkq..