Python覚え書き

コマンドライン引数を取得する

素で書く場合は、sys.argv から取得して自分でパースする必要がある

import sys

args = sys.argv
print(args)

argparse を使用すれば楽

import argparse

parser = argparse.ArgumentParser(description='引数取得のテスト')
parser.add_argument('--max', type=int, default=30, help='最大値(デフォルト: 30)')
args = parser.parse_args()
print(f'max is {args.max}')

https://docs.python.jp/3/library/argparse.html

日付文字列を datetime オブジェクトに変換する

from datetime import datetime

date_text = '2018-01-01T01:02:03Z'
target_datetime = datetime.strptime(date_text, '%Y-%m-%dT%H:%M:%SZ')

datetime を 日付文字列に変換する

from datetime import datetime

target_datetime = datetime.now()
date_text = target_datetime.strftime('%Y-%m-%dT%H:%M:%SZ')

日付の加算

from datetime import datetime
from datetime import timedelta

target_date = datetime.now()
time_minutes = timedelta(minutes=int(minutes))
print(target_date + time_minutes)

日時を年月日単位で切り捨てる

datetime.timetuple で取得したタプルを、datetimeの引数に指定する事により、切り捨てられたdatetimeが得られる。

from datetime import datetime

def trunc_date(target_date):
    """ 
    日時を年月日単位で切り捨てる
    """
    now_date_tuple = target_date.timetuple()[:3]  # 年月日のタプルを取得
    #now_date_tuple = target_date.timetuple()[:4]  # 年月日時のタプルを取得
    #now_date_tuple = target_date.timetuple()[:5]  # 年月日時分のタプルを取得
    return datetime(*now_date_tuple)

print(trunc_date(datetime.now()))

With構文を使用して開始、終了処理を行う

__enter__ 及び __exit__ メソッドを持つクラスを with 構文と共に利用することで、開始、終了処理を行う事ができる。

sample_with.py

# coding: utf-8

class SampleWith(object):
    def __init__(self):
        print('\t with class init')

    def __enter__(self):
        # 開始処理
        print('\t with class enter')

    def __exit__(self, exc_type, exc_value, tb):
        # 終了処理
        print('\t with class exit')


if __name__ == '__main__':
    print('start')
    with SampleWith() as sample:
        print('\t\t internal start')
        for i in range(10):
            print(f'\t\t\t point {i:05d}')
        print('\t\t internal end')
    print('end')

実行結果

$python3 sample_with.py
start
	 with class init
	 with class enter
		 internal start
			 point 00000
			 point 00001
			 point 00002
			 point 00003
			 point 00004
			 point 00005
			 point 00006
			 point 00007
			 point 00008
			 point 00009
		 internal end
	 with class exit
end

リストをマージする

l1 = ['abc', 'def']
l2 = ['ghi', 'jkl']
l1.extend(l2)
print(l1)

結果

['abc', 'def', 'ghi', 'jkl']

リストをマージして別のリストを作る

l1 = ['abc', 'def']
l2 = ['ghi', 'jkl']
l3 = l1 + l2
print(l3)

結果

['abc', 'def', 'ghi', 'jkl']

dictをマージする

d1 = {'var1': 'abc', 'var2': 'def'}
d2 = {'var3': 'ghi', 'var4': 'jkl'}
d3 = {**d1, **d2}
print(d3)

結果

{'var1': 'abc', 'var2': 'def', 'var3': 'ghi', 'var4': 'jkl'}

dictのリストの各要素に値を追加/変更する

l1 = [
    {'var1': 'a1', 'var2': 'b1'},
    {'var1': 'a2', 'var2': 'b2'}
]

# 各要素にvar3を追加
l2 = [{**x, **{'var3': f'c{i+1}'}} for i, x in enumerate(l1)]
print(f'l2: {l2}')

# 各要素のvar1の値を変更
l3 = [{**x, **{'var1': f'X{i+1}'}} for i, x in enumerate(l1)]
print(f'l3: {l3}')

結果

l2: [{'var1': 'a1', 'var2': 'b1', 'var3': 'c1'}, {'var1': 'a2', 'var2': 'b2', 'var3': 'c2'}]
l3: [{'var1': 'X1', 'var2': 'b1'}, {'var1': 'X2', 'var2': 'b2'}]

リストをソートする

# 元リスト自体を変更する
l1 = [10, 1, 5, 3, 4, 6, 7]
l1.sort()
print(f'l1: {l1}')
l1.sort(reverse=True)
print(f'l1(reverse): {l1}')

# 結果を別リストに格納する
l1 = [10, 1, 5, 3, 4, 6, 7]
l2 = sorted(l1)
print(f'l2: {l2}')
l2 = sorted(l1, reverse=True)
print(f'l2(reverse): {l2}')

# dictのリストを特定のキーでソートする
from operator import itemgetter

dict_list = [
    {'var1': 1, 'var2': 4, 'var3': 'c'},
    {'var1': 4, 'var2': 2, 'var3': 'd'},
    {'var1': 2, 'var2': 3, 'var3': 'a'},
    {'var1': 3, 'var2': 1, 'var3': 'b'}
]
sorted_dict_list = sorted(dict_list, key=itemgetter('var2'))  # var2の値でソートする
print(f'sorted_dict_list: {sorted_dict_list}')

結果

l1: [1, 3, 4, 5, 6, 7, 10]
l1(reverse): [10, 7, 6, 5, 4, 3, 1]
l2: [1, 3, 4, 5, 6, 7, 10]
l2(reverse): [10, 7, 6, 5, 4, 3, 1]
sorted_dict_list: [{'var1': 3, 'var2': 1, 'var3': 'b'}, {'var1': 4, 'var2': 2, 'var3': 'd'}, {'var1': 2, 'var2': 3, 'var3': 'a'}, {'var1': 1, 'var2': 4, 'var3': 'c'}]

デコレータを使用する

YAMLを扱う

プログラムから扱う場合

PyYAMLを利用すれば json とほぼ同じIFで扱う事ができる。

https://pypi.org/project/PyYAML/
https://pyyaml.org/wiki/PyYAML

インストール

pip install pyyaml

利用方法

# coding: utf-8

import yaml

if __name__ == '__main__':
    data = { 
        'var1': 'aaa',
        'list1': [
            {'listvar1': 'test1-1', 'listvar2': 'test1-2'},
            {'listvar1': 'test2-1', 'listvar2': 'test2-2'}
        ],  
        'map1': {
            'mapvar1': 'ABC',
            'maplist2': [
                '111', '222'
            ],  
            'mapmap3': {
                'var1': 10, 
                'var2': 20
            }   
        }   
    }   
    print('##### dict -> yaml(str) #####')
    yaml_str = yaml.dump(data)
    print(yaml_str)
    print('##### yaml(str) -> dict #####')
    yaml_dict = yaml.load(yaml_str)
    print(yaml_dict)

実行結果

python index.py

##### dict -> yaml(str) #####
list1:
- {listvar1: test1-1, listvar2: test1-2}
- {listvar1: test2-1, listvar2: test2-2}
map1:
  maplist2: ['111', '222']
  mapmap3: {var1: 10, var2: 20}
  mapvar1: ABC
var1: aaa

##### yaml(str) -> dict #####
{'list1': [{'listvar1': 'test1-1', 'listvar2': 'test1-2'}, {'listvar1': 'test2-1', 'listvar2': 'test2-2'}], 'map1': {'maplist2': ['111', '222'], 'mapmap3': {'var1': 10, 'var2': 20}, 'mapvar1': 'ABC'}, 'var1': 'aaa'}

コマンドラインから扱う場合

コマンドラインから扱う場合は yq が楽。( jq ライクに扱える )
https://yq.readthedocs.io/en/latest/

インストール

pip install yq

利用方法

# 標準入力からYAMLを読み込んでJSONに変換
cat input.yml | yq .

# 標準入力からJSONを読み込んでYAMLに変換
cat input.json | yq -y .

# ファイルを指定してYAMLからJSONに変換
yq . input.yml

# ファイルを指定してJSONからYAMLに変換
yq -y . input.json

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-11-02 (金) 07:33:38 (172d)