Created
March 28, 2017 07:36
-
-
Save mrbkdad/a4f596764a820b2eabcf80b2e7942bbb to your computer and use it in GitHub Desktop.
파이썬으로 만든 유용한 유틸리티들
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 유용한 유틸\n", | |
"- 텍스트를 두개의 기준으로 잘라내기\n", | |
"- 구간 날짜 리스트 생성\n", | |
"- 리눅스 wget 명령어\n", | |
"- 디렉토리 존재 유무 체크하여 없으면 디렉토리 생성" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 112, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"# 텍스트를 두개의 구분자를 가지고 분리\n", | |
"def bsplit(s,sep1,sep2=None,maxsplit=-1):\n", | |
" # sep1과 sep2를 기준으로 텍스트를 분리\n", | |
" # sep2 == None 이면 split(sep1,maxsplit)\n", | |
" if sep2 is None:\n", | |
" return s.split(sep1,maxsplit)\n", | |
" result = []\n", | |
" cur,pos = 0, 0 # 현재 포인트와 find 포인트 처리용\n", | |
" sep = None # find 시 적용 대상, sep1 과 sep2를 번갈아 적용\n", | |
" \n", | |
" \"\"\" 1. sep1 과 sep2를 번갈아 가며 찾기 ==> pos\n", | |
" 찾으면 cur과 pos 사이 분리저장 후 다음단계\n", | |
" 못찾으면 cur 이후 전체 저장 리턴\n", | |
" 2. 저장한 리스트 사이즈와 maxsplit 비교\n", | |
" 같으면 리턴\n", | |
" 다르면 다음 진행 : cur과 pos 구하여 1번 반복\n", | |
" \"\"\"\n", | |
" sep = sep1 if sep is None or sep == sep2 else sep2\n", | |
" pos = s.find(sep,cur)\n", | |
" while pos != -1:\n", | |
" if pos > cur: # 값 분리저장\n", | |
" result.append(s[cur:pos])\n", | |
" cur = pos + len(sep)\n", | |
" if maxsplit != -1 and maxsplit == len(result):\n", | |
" break\n", | |
" sep = sep1 if sep is None or sep == sep2 else sep2\n", | |
" pos = s.find(sep,cur)\n", | |
" \n", | |
" if maxsplit != -1 and maxsplit < len(result) and cur < len(s)-1:\n", | |
" result.append(s[cur:])\n", | |
" return result" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 122, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"['bc']" | |
] | |
}, | |
"execution_count": 122, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"bsplit('abcdefghiagcksuekhad','a','d',maxsplit=1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 141, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(-31, 3)" | |
] | |
}, | |
"execution_count": 141, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"from datetime import datetime, timedelta\n", | |
"\n", | |
"delta = datetime.strptime('20170102','%Y%m%d') - datetime.strptime('20170202','%Y%m%d')\n", | |
"delta.days, timedelta(days=3).days" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 142, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"from datetime import datetime, timedelta\n", | |
"\n", | |
"## YYYYMMDD 형식의 문자열 두개를 인자로 문자형 날짜 Range 생성\n", | |
"def timeiter(start,end,fmt='%Y%m%d'):\n", | |
" date1 = datetime.strptime(start,'%Y%m%d')\n", | |
" date2 = datetime.strptime(end,'%Y%m%d')\n", | |
" delta = date2 - date1\n", | |
" return (datetime.strftime(date1+timedelta(days=d),fmt) for d in range(delta.days + 1))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 149, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"['2017-03-03',\n", | |
" '2017-03-04',\n", | |
" '2017-03-05',\n", | |
" '2017-03-06',\n", | |
" '2017-03-07',\n", | |
" '2017-03-08',\n", | |
" '2017-03-09',\n", | |
" '2017-03-10']" | |
] | |
}, | |
"execution_count": 149, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"list(timeiter('20170303','20170310',fmt='%Y-%m-%d'))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 127, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import os\n", | |
"import requests\n", | |
"# 파일명을 받아 해당 디렉토리 존재 여부 체크후 없으면 생성, 있으면 넘어감\n", | |
"def check_dir(filename):\n", | |
" folder = os.path.dirname(filename)\n", | |
" if not os.path.exists(folder):\n", | |
" os.makedirs(folder)\n", | |
"\n", | |
"## 리눅스의 wget 함수와 같은 기능\n", | |
"## 사용되는 url의 특성에 따라 변경이 필요\n", | |
"def wget(url,to=None):\n", | |
" # URL과 저장 파일 명을 받아 해당 URL에서 내용을 읽어 파일로 저장\n", | |
" local_filename = url.split('/')[-1]\n", | |
" if to:\n", | |
" local_filename = to\n", | |
" req = requests.get(url,stream=True)\n", | |
" ## header 가 필요한 경우 requests.get(url, stream=True, header 추가)\n", | |
" ## post 방식인 경우 get을 post로 변경\n", | |
" ## session 이 필요한 경우 session 을 생성하여 처리\n", | |
" with open(local_filename,'wb') as fp:\n", | |
" for chunk in req.iter_content(chunk_size=1024):\n", | |
" if chunk:\n", | |
" fp.write(chunk)\n", | |
" fp.flush()\n", | |
" return local_filename" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 128, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'test/google.txt'" | |
] | |
}, | |
"execution_count": 128, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"check_dir('test/google.txt')\n", | |
"wget('http://google.com','test/google.txt')" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.5.2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment