Python/2.7 information 74

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 의 첫번째 답에서 유용한 부분만 가져온다...

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에 관련된 표준 함수가 없다고 하는 그 이유는 여기에 나..

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. 리스트에서 인덱스로 엘리먼트를 가져오듯이, 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..

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

python smtp(메일보내기)

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

python 딕셔너리에 관하여, 파이써닉하게 코드 짜기

http://khanrc.tistory.com/entry/PyCon-%EC%9C%84%EB%8C%80%ED%95%9C-dict-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B3%A0-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0 에서 내용을 가져와서 정리했습니다. 문제시 바로 삭제하겠습니다 댓글달아주세요!. 파이썬의 기본 문법에 대해서는 진짜 거의 모르는게 없다고 생각했는데... 저 블로그를 보면서 아직 부족함을 느꼈습니다. 1. 키와 값 바꾸기. 간단하게 아래와 같은 딕셔너리 컴프리핸션 으로 되네요... 리스트로 만들어서 dict()함수로 덮어씌우고 그랬었는데.. # -*- encoding: cp949 -*- a = {'a': 1, 'c': 3, 'b': 2} print ..

다차원 리스트를 만들고 복사하는 것에 대해서.

파이썬에서 다차원 리스트는 여러가지 방법으로 만들수 있다. 5칸의 1차원 리스트는 아래와 같이 만들수 있다. a = [0 for i in xrange(5)] 또는 a = [0]*5. 5*5칸의 2차원 리스트는 아래와 같이 만들수 있다. a = [[0 for j in xrange(5)] for i in xrange(5)] 또는 a = [[0]*5]*5 파이썬을 많이 안써본 분들은 오 후자가 더 짧고 좋네. 전자는 버리고 후자만 외워둬야지. 하겠지만 난 주로 전자의 방법을 쓴다. 후자는 안 쓰는 편이다. 이유는 후자처럼 다차원 리스트를 만들면 리스트가 제대로 복사가 안되기 때문이다. 1차원 리스트는 문제가 없다. a = [0]*5 a[1] = 1 print a a = [0 for i in xrange(5)]..

next_permutations, prev_permutation, k permutations

https://www.huangwenchao.com.cn/2015/05/python-permutation.html 쓸일이 많을것같아서 저장. 파이썬의 itertools모듈에 permutations가 있지만 다음거 구하는게 없이 전부 다 구하는거다. 종종 다음 permutations가 필요할 때가 있는데 그때를 위해 저장. # -*- encoding: cp949 -*- def next_permutation(a): if len(a) = 0 and a[i] >= a[i+1]: i -= 1 if i = a[k]: k -= 1 (a[i], a[k..

파이썬의 변수에 관하여.

파이썬으로 코딩을 하다 보면 이런 경우가 있다. 앞의 TSP문제를 조금 바꿨다. http://qkqhxla1.tistory.com/677 아래의 코드에서 난 global_ret이라는 전역변수에 tsp의 경로 정보를 담고 싶다. 그래서 경로를 다 돌았으면 리턴되기 전에 경로를 전역변수인 global_ret에 저장해놨다. 그러고 마지막에 global_ret을 출력해보면 함수 안에서 경로 정보를 할당했으니 경로 정보가 있을거라고 예측할수있다. 그런데... 뭔가 이상하다.아래의 출력부를 보면 final_path = 으로 path값이 공백이 아니라는걸 확인하기위해 출력해봤다. 공백이 아닌걸 확인후 바로 아랫줄에 global_ret에 path를 할당해줬다. 그런데 맨 마지막에 global_ret 을 출력해보면 공백..

dict과 list에서 어떤 값을 찾을 경우.

전에도 알고있었는데 그냥 그렇구나 하고 넘어갔던 문제이다. 알고리즘 문제를 풀면서 아 이랬어도 됬구나! 하면서 다시 깨달았다. 역시 코딩은 실전. 리스트에서 어떤 값을 찾는다고 했을때는 O(n)의 시간복잡도가 걸린다. 왜냐하면 하나하나 반복문을 돌면서 값이 맞는지 검사를 해야 하기 때문이다. 그런데 딕셔너리같은경우는 시간복잡도가 O(1)이다. 딕셔너리는 해쉬 테이블이기 때문에 메모리에 값을 직접 저장해놓기 때문이다. 즉 딕셔너리는 메모리를 조금 더 먹는 대신 어떤값을 찾을때 빠르다고 보면 되겠다. 알고리즘 문제를 풀때 파이썬의 특성상 시간초과가 나는 경우가 많이 있는데 이때 리스트대신 딕셔너리를 쓰면 해결될수 있을것 같다. http://stackoverflow.com/questions/513882/pyt..

in operator 탐구.

요즘 알고리즘 공부를 하고있는데 파이썬보다는 c로 문제를 풀려고 노력중이다. 그런데 c로 코드를 짜던중 파이썬의 in operator가 c에는 없어서, 이걸 어떻게 만들어야하나 하고 생각하다가 갑자기 그럼 python의 in은 어떤 알고리즘으로 구현되있을까? 하는 생각이 들었다. in operator는 문자열 안에 특정 문자열이 들어있는지 검사하는 그런 operator이다.(리스트나 튜플, 딕셔너리의 경우에도 특정 원소가 있는지 검사.) 문자열 관련해서 검색 알고리즘은 내가 알고있는건 kmp,보이어 무어밖에 없다. 이런 비스무레한걸 사용하려나..? 추측해보고 리스트나 튜플 같은경우에는 아무리 생각해봐도 하나하나 찾아보는것 이외에 특정 알고리즘을 생각할수가 없다. 그래서 c 코딩을 하다 말고 python의..

Iterator, Generator, Decorator

예전에 참고하라고 링크를 블로그에 올리긴 했는데...(올려놓기만 하고 자세히 들여다보지는 않았다.) 이터레이터는 뭔지 알겠는데 데코레이터와 제너레이터의 개념을 잘 모르겠어서 좋은 블로그를 보고 정리했다. 이터레이터, 제너레이터 참고 : http://friberry.com/?p=254데코레이터 참고 : http://ravenkyu.github.io/python_investigation/2015/09/07/decorator/ 이터레이터.이터레이터가 뭔지 쓰려다가 말로 표현을 못 하겠어서 예시를 찾아봤다.간단한건데 여기 블로그(c로 설명됨)처럼 반복적으로 처리하는 것을 말한다. 이터레이터에 관한 설명은 저 블로그보다는 자바나 c++(을 아는 사람은)관련해서 같이 참고하면 이해하기가 조금 더 편할것 같다.c++..

함수 리팩토링 관련 모듈들.

파이썬코리아에 어떤 분이 글을 올리셨다.눈팅하다 나라면 어떻게 할까 생각해봤는데 아래 댓글에도 있었지만 *args, **kwargs등을 이용해서 어떻게든 만들겠다.. 라고 구상만 하고 있었는데 이게 진짜 되는지 여러가지 방법론이 올라왔다.당연히 나중에 쓸 일이 있을지 모르지만 쓰게되면 엄청나게 유용하게 보이기에 정리함. 1. multimethods 모듈이 있다고 한다. https://pypi.python.org/pypi/multimethods/(아무리 찾아봐도 어떻게 쓰는지 잘 모르겠다.;) 2. 파이썬 3.4버전 이상에서는 https://docs.python.org/3/library/functools.html 요걸 사용할수 있다고 한다. 아래 코드는 예제. from functools import sin..