ウェブインコ

インコの技術メモ

Python3

正規表現で探す
find() や match() などいらぬ。

hoge = 'Curry Hamburger Ramen'
if re.search(r'Hamburg.*', hoge):
	print('Hakushon Great Demon King')


正規表現の $1 置換 置き換え
\1
re.sub で書くときは \\1 です。
例)

res = re.sub(r'(\d+) (.*)', "\\1 と \\2", "1234 abcd")


辞書←→JSON
辞書 → JSON
dict = {'name':'hoge','hp':100}

json_str = json.dumps(dict)
JSON → 辞書
json_str = '{"name":"hoge","hp":100}'
dict = json.loads(json_str)
テキストファイルから辞書
path = '/home/ec2-user/hoge.json'
with open(path) as f:
    dic = json.load(f)


ファイル読み込み
テキストファイルから改行を削除してリスト化。( readlines() だと改行が付いて回るので)

filepath = '/home/ec2-user/hoge.txt'
list = []
with open(filepath, 'r', encoding='shift_jis', errors='', newline='') as f:
    list = f.read().splitlines()


if を後ろにつける書き方
エレガントかな。

hoge.append(fuga['wara']) if fuga.get('wara') else None
else が無いとコケますので適当なこと書いときます。


重複削除

ar = [1,2,3,4,5,4,3,2,1]
ar = set(ar)
ar = list(ar)
print(ar)
[1,2,3,4,5]
else が無いとコケますので適当なこと書いときます。


辞書の深い階層から値を採る
Python は無かったらコケますので。
例えば以下の辞書から c が欲しいとき

dict = {
  'a': {
    'b': {
      'c': '2014-05-15'
    }
  }
}
ymd = dict.get('a', {}).get('b', {}).get('c')
これでコケません。


辞書のリストのソート

gonsu = [
	{"funa":"1001", "hoge":"002"},
	{"funa":"1002", "hoge":"001"},
	{"funa":"1001", "hoge":"001"}
]
gonsu = sorted(gonsu, key=lambda x: (x['funa'], x['hoge']))
↓
gonsu = [
	{"funa":"1001", "hoge":"001"},
	{"funa":"1001", "hoge":"002"},
	{"funa":"1002", "hoge":"001"}
]
(降順)
gonsu = sorted(gonsu, key=lambda x: (x['funa'], x['hoge']), reverse=True)


辞書のソート
キーで。

gonsu = {"hoge_02":"fuga", "hoge_01":"hage", "hoge_03":"funa"}
gonsu = sorted(gonsu.items())
↓
{"hoge_01":"hage", "hoge_02":"fuga", "hoge_03":"funa"}
[('hoge_01', 'hage'), ('hoge_02', 'fuga'), ('hoge_03', 'funa')]
(降順)
gonsu = sorted(gonsu.items(), reverse=True)
値で。
gonsu = {"hoge_02":"fuga", "hoge_01":"hage", "hoge_03":"funa"}
gonsu = sorted(gonsu.items(), key=lambda i: i[1])
↓
{"hoge_02":"fuga", "hoge_03":"funa", "hoge_01":"hage"}
[('hoge_02', 'fuga'), ('hoge_03', 'funa'), ('hoge_01', 'hage')]
(降順)
gonsu = sorted(gonsu.items(), key=lambda i: i[1], reverse=True)


配列のソート

gonsu = ["hage", "funa", "hoge"]
gonsu.sort()
↓
["funa", "hage", "hoge"]
(降順)
gonsu.sort(reverse=True)


余白改行等の削除

hoge = hoge.strip("削除したい文字列")
引数を省略すると「空白」と「改行」が削除
hoge = hoge.lstrip("削除したい文字列") # 文字列の先頭から
hoge = hoge.rstrip("削除したい文字列") # 文字列の末尾から


2重ループを抜ける
こんな感じ。

for d1 in dis1:
    for d2 in dis2:
        if d1 == d2: # ループを終わらせたい条件
            break
    else:
        continue
    break


ループ中に現在何週目か
enumerate() でくるみます。
例)下記では i 。 0 から始まります。

for i, hoge in enumerate(hogeArray):
  print(i)
ついでに他のループ。
配列
hogeA = ['ほげ','はげ','ふが']
for hoge in hogeA:
  print(hoge)
↓
ほげ
はげ
ふが
辞書 (連想配列、ハッシュ)
hogeD = {'hoge':'ほげ', 'hage':'はげ', 'fuga':'ふが'}

for hoge in hogeD:
  print(hoge)
↓
hoge
hage
fuga

for hoge in hogeD.keys():
  print(hoge)
↓
hoge
hage
fuga

for hoge in hogeD.values():
  print(hoge)
↓
ほげ
はげ
ふが
for k, v in hogeD.items():
  print(k, v)
↓
hoge ほげ
hage はげ
fuga ふが
数字で
for i in range(-1,2):
  print(i)
↓
-1
0
1
2

cnt = 0
while cnt < 3:
  cnt += 1
  print(cnt)
↓
1
2
3


コマンド実行

import subprocess
単なる実行
cmd = "python hoge.py"
proc = subprocess.Popen(cmd.strip().split(" "))
複数実行
for cmd in cmds:
  proc = subprocess.Popen(cmd.strip().split(" "))
  proc.wait()
返り血
cmd = 'df -h'
res = subprocess.check_output(cmd.strip().split(" "))
print(res)


年月日

from datetime import datetime, timedelta
today = datetime.now()
yesterday = today - timedelta(1)
tomorrow = today + timedelta(1)
print(yesterday.strftime('%Y%m%d'))
print(today.strftime('%Y%m%d'))
print(tomorrow.strftime('%Y%m%d'))
↓
20221204
20221205
20221206
或いは、
import datetime
today = datetime.datetime.now()
tomorrow = today + datetime.timedelta(1)


コンフィグファイルに任意の変数名があるかないか

vi config.py
HOGETEISUU = ["unko"]
import config
if hasattr(config, 'HOGETEISUU') :
 print(config.HOGETEISUU)
Python には定数がないので、別ファイルで変数を設定して定数っぽく使ったりするのですが(是非はおいといて)
なにげに「要らないからコメントアウト」されがちなので、こんな感じの if 文で対処。


Python の特徴。インデントとか
・Python はインデントで文章のかたまりを表します。
 ・{ } は有りません。

if hoge == 1 : # 条件文等の終わりは :
    print(hoge)
elif hoge == 2 : # else if は elif です。
    print(hoge)
else : # コメントは # から文末まで。まとめてくくるのは有りません。
    print(hoge)
hoge = 92  # if と同じ階層
print()

・文末に ; は不要です。改行が文の終わりになります。
・変数に $ はいりません。
・ダブルクォーテーション、シングルクォーテーションの区別はありません。
・前に r を付けると確実にそのまま表示します。
    例)
    print('123\n456') # エスケープ文字を置換
    123
    456
    print(r'123\n456') # そのまま表示
    123\n456


配列の結合
2つの配列をつなぐ
dat = [1,2,3]
dat2 = [4,5]

dat.extend(dat2)
print(dat)
[1,2,3,4,5]

配列に要素を追加
dat = [1,2,3]
dat.append(4)
dat.append(5)
print(dat)
[1,2,3,4,5]

いずれも返り血はないです。強いて言うなら None になります。

配列←→CSV
配列 → CSV
arr = ['poodle1', 'poodl2', 'poodl3']

csv = ','.join(arr)
CSV → 配列
csv = 'poodle1,poodl2,poodl3'
arr = csv.split(',')


最後の一文字がいらない
line = 'aaa,bbb,ccc,ddd,'

print(line[:-1])
aaa,bbb,ccc,ddd


前から〇〇文字
前から4文字: 文字.[0:4]
hoge = '20180223'

yyyy = hoge.[0:4]


頭ゼロ埋め
2桁ゼロ埋め: 文字.zfill(2)
hoge = 2

mm = hoge.zfill(2)


NULL の判定
if hoge: は 0 や空白も含まれます。

if hoge is None:
if hoge == None:
(否定文)
if hoge is not None:
if hoge != None: