Skip to content

Instantly share code, notes, and snippets.

@mrbkdad
Created March 28, 2017 07:36
Show Gist options
  • Save mrbkdad/a4f596764a820b2eabcf80b2e7942bbb to your computer and use it in GitHub Desktop.
Save mrbkdad/a4f596764a820b2eabcf80b2e7942bbb to your computer and use it in GitHub Desktop.
파이썬으로 만든 유용한 유틸리티들
Display the source blob
Display the rendered blob
Raw
{
"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