Python †
ライブラリ †
module pathの表示 †
行末の改行の削除 †
- rstrip(): 右端から1文字を削除
str.rstrip('\n')
簡易httpサーバ †
- kill
pkill -u $USER python
文字コード変換 †
CSV/TSVの処理 †
pandas: データ分析支援ライブラリ †
並列処理 †
Webスクレイピング †
Apache Parquet形式を扱う: 列指向のデータフォーマット †
書式付き文字列 †
- python2
python -c 'print("%d %s" % (1, "2str"))'
1 2str
# python2.6〜
python -c 'print("{0} {1}".format(1, "2str"))'
1 2str
python -c 'print("{var1} {var2}".format(var1=1, var2="2str"))'
1 2str
memory-profiler: メモリ使用量の計測 †
dockerイメージ †
- [python - Docker Hub](https://hub.docker.com/_/python)
- python公式のdocker image
- *-slim: pipでビルド済みmoduleがインストールされる。最終イメージサイズは小さくなりやすい。
- *-alpine* : 初期イメージサイズは小さいが、ビルドが必要なmoduleが多いと肥大化しやすい。
CLIツール作成 †
パフォーマンス/最適化 †
変数の型 †
パッケージ管理/バージョン固定 †
asyncio: 非同期実行 †
検証/Validation †
グラフ描画 †
ベンチマーク †
コーディング規約 †
構文チェック †
他言語のように構文チェック用のコマンドラインオプションは無いようだ。
autopep8 †
- Python標準のコーディング規約pep8 準拠のツール
pip install autopep8
pylint †
- VSCodeのpython拡張でのデフォルトに指定されているツール
pip install pylint astroid --pre -U
pylint --generate-rcfile > ~/.pylintrc
-m †
- -m: pycファイルを作るオプションで簡易チェックになるか。
python -m source.py
バージョン間の互換性 †
テキストに色を付ける/エスケープシーケンス †
envを指定する時 †
- #!/usr/bin/env python
- OK: macOS Sierra
- OK: CentOS 6/7
- #!/bin/env python
- NG: macOS Sierra
- OK: CentOS 6/7
subprocess : 外部コマンド実行 †
例外発生時にstack traceの表示 †
- 実行結果
./exception.py
Traceback (most recent call last):
File "./exception.py", line 13, in <module>
f = open('sample.txt', 'r')
IOError: [Errno 2] No such file or directory: 'sample.txt'
InsecurePlatformWarningの抑制 †
yamlの読み書き †
pudb: CUIだけどグラフィカルなデバッガ †
pythonデフォルトのデバッガはpdbだが、前後のソースコードが表示されないため、分かりにくい。
pudbはMain, Variables, Stack, Breakpoints画面に分割されるため操作しやすい。
- インストール
sudo pip install pudb
コマンド | 説明 | ? | ヘルプ | q | 終了 | n | ステップオーバー | s | ステップイン | r | リターン | b | ブレークポイント |
pdb: 標準デバッガ †
httplib2でエラーが出た場合 †
- ソースからインストールしたpython2.7で以下のようなエラーが出た
File "/usr/local/lib/python2.7/httplib.py", line 924, in putheader
str = '%s: %s' % (header, '\r\n\t'.join(values))
TypeError: sequence item 0: expected string, int found
autopep8: ソースコードを自動でPEP8形式に整形 †
モジュール一覧の取得 †
python -c "help('modules')"
var_dump: PHP風オブジェクトダンプ †
pprint()では文字列、数値、リストといった特定のオブジェクトしかダンプしてくれない。
PHPのvar_dumpはクラス内部の変数もダンプしてくれて便利だったので、似たようなものがあった。
- サンプル
vim test.py
----
# -*- coding:utf-8 -*-
import sys
from pprint import pprint
from var_dump import var_dump
class node(object):
def __init__(self, name, contents=[]):
self.name = name
self.contents = contents[:]
x = [node("node-1")]
print("pprint: ")
pprint(x)
print("var_dump: ")
var_dump(x)
----
python test.py
pprint:
[<__main__.node object at 0x7f15f9723850>]
var_dump:
[{'__type__': '<node #0x7f15f9723850>', 'contents': [], 'name': 'node-1'}]
WOL(Wake on LAN) †
- http://ja.wikipedia.org/wiki/Wake-on-LAN
- BIOSでWOLが有効な場合にマジックパケットを送信して電源ONにする
import socket
import binascii
def wol(macs, ip='<broadcast>', port=9):
"""
wake on lan
"""
macs = macs.split(',')
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
for mac in macs:
for sep in ':-':
if sep in mac:
mac = ''.join([x.rjust(2, '0') for x in mac.split(sep)])
break
mac = mac.rjust(12, '0')
p = '\xff' * 6 + binascii.unhexlify(mac) * 16
s.sendto(p, (ip, port))
s.close()
wol(macs='11-22-33-44-55-66,77-88-99-AA-BB-CC') # 文字列
wol(macs=['11-22-33-44-55-66','77-88-99-AA-BB-CC']) # 配列
isinstance : 変数の型を調べる †
print isinstance("test", str) # True
print isinstance(10, int) # True
ping †
簡易ポートオープンチェック †
- socketを使う
import socket
def is_port_open(ip, port):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM,0)
s.settimeout(1)
s.connect((ip, int(port)))
s.close()
return True
except Exception, e:
return False
print is_port_open('localhost', 22)
# True
三項演算子 †
分岐して代入処理が1行で書ける
slappasswd互換の{SSHA}, {SHA}形式の生成 †
# -*- coding: utf8 -*-
import os
import hashlib
import base64
def slappasswd(password, password_scheme, salt=os.urandom(4)):
hash = False
if password_scheme == "{SSHA}":
ctx = hashlib.sha1()
ctx.update( password )
ctx.update( salt )
hash = "{SSHA}" + base64.b64encode( ctx.digest() + salt )
elif password_scheme == "{SHA}":
ctx = hashlib.sha1()
ctx.update( password )
hash = "{SHA}" + base64.b64encode( ctx.digest() )
return hash
print slappasswd('secret', '{SSHA}') # {SSHA}QYkKRfdg3uEIajHpiyYXxUJSBqaZTRod
print slappasswd('secret', '{SHA}') # {SHA}5en6G6MezRroT3XKqkdPOmY/BfQ=
ヒアドキュメント中で変数参照 †
- 実行結果
var1=foo
var2=bar
{str}
複数階層のディレクトリ削除 †
re: 正規表現 †
tempfile: 一時ファイル/ディレクトリ †
ヒアドキュメントの行頭スペースを削除 †
message = """
default
message
"""[1:-1]
print(message)
日付/時刻/タイムゾーン †
- 日付期間
# -*- coding: utf8 -*-
# sudo pip install python-dateutil
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
start_date = datetime.strptime('20130930', '%Y%m%d')
end_date = datetime.strptime('20131002', '%Y%m%d')
# date span
for dt in range((end_date - start_date).days + 1):
print start_date + timedelta(dt)
# 2013-09-30 00:00:00
# 2013-10-01 00:00:00
# 2013-10-02 00:00:00
# month span
print start_date
while(start_date.year != end_date.year or
start_date.month != end_date.month):
start_date = start_date + relativedelta(months=1)
print start_date
# 2013-09-30 00:00:00
# 2013-10-30 00:00:00
- 例:タイムゾーン
from datetime import datetime, tzinfo
import pytz
# デフォルトはtimezoneが無い
print datetime.now().strftime('%Y-%m-%d %H:%M:%S %Z') # 2013-10-22 16:37:01
# UTC
print datetime.now(pytz.timezone('UTC')).strftime('%Y-%m-%d %H:%M:%S %Z') # 2013-10-22 07:37:53 UTC
# GMT
print datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%d %H:%M:%S %Z') # 2013-10-22 07:37:53 GMT
# JST
print datetime.now(pytz.timezone('Asia/Tokyo')).strftime('%Y-%m-%d %H:%M:%S %Z') # 2013-10-22 16:38:30 JST
# UTCからJSTへ変換
date_utc=datetime.now(pytz.timezone('UTC'))
print date_utc.strftime('%Y-%m-%d %H:%M:%S %Z') # 2013-10-22 08:01:06 UTC
print date_utc.replace(tzinfo=pytz.timezone('UTC')).astimezone(pytz.timezone('Asia/Tokyo')).strftime('%Y-%m-%d %H:%M:%S %Z') # 2013-10-22 17:01:06 JST
# 日付文字列からdatetimeへ変換
date_str="22/Oct/2013:17:19:41 +0900"
date_jst=datetime.strptime(date_str, '%d/%b/%Y:%H:%M:%S +0900') # %zが使えなかった(Python 2.6.6, 2.7)
print date_jst.strftime('%Y-%m-%d %H:%M:%S %Z') # 2013-10-22 17:19:41
sys.argv : コマンドライン引数 †
logging †
- code:
from logging import getLogger, StreamHandler, Formatter, DEBUG
logger = getLogger(__name__)
formatter = Formatter('%(asctime)s %(levelname)-8s %(message)s')
handler = StreamHandler()
handler.setLevel(DEBUG)
handler.setFormatter(formatter)
logger.setLevel(DEBUG)
logger.addHandler(handler)
logger.debug("debug")
logger.info("info")
logger.warning("warning")
logger.error("error")
logger.critical("critical")
- run:
2017-08-01 14:56:32,251 DEBUG debug
2017-08-01 14:56:32,251 INFO info
2017-08-01 14:56:32,251 WARNING warning
2017-08-01 14:56:32,252 ERROR error
2017-08-01 14:56:32,252 CRITICAL critical
特殊変数 †
- __name__
- スクリプトとして実行された場合は '__main__'
- moduleとして呼び出された場合は 'モジュール名'
ソースコードにUTF-8を使う †
- 行頭付近に以下を追加
# -*- coding: utf-8 -*-
has_key : 辞書側でキーを持っているかを調べる †
d = {'hoge': 100, 'foo':200, 'bar':300}
if d.has_key('hoge'):
print 'hoge found!'
hasattr : 属性があるかどうかを調べる †
チートシート †
BASIC認証ページを取得 †
urllib.FancyURLopenerをオーバーライドしてID/PASSを返してやれば良い。
import urllib
class MyURLopener(urllib.FancyURLopener):
def prompt_user_passwd(self, host, realm):
if host == 'ホスト名':
return ('ID', 'Password')
def execute(hdf, args, env):
opener = MyURLopener({})
f = opener.open('https://svn.example.com/projects/ppc/wiki/FctlPpc/mysql')
print f.read()
f.close()
execute(1,2,3)
pyスクリプトをexe形式に変換 †
- py2exe
Pythonインストールしなくても実行可能になる。(ランタイムDLLのインストールは必要)
|
|