ホーム > matplotlibの使い方 > python

PythonのTIPS


目次

[top]



時刻形式

時刻形式データの作成

datetimeで扱うことのできる時刻形式データを作成する


時刻形式データから年、月、日などを取り出す

時刻形式データ.取り出したい要素


時刻形式データから書式指定して取り出す

datetime.strftimeを使う


時刻形式データの演算

datetime.timedeltaを使うことで時刻形式データの演算を行うことができる


1ヶ月後、1年後を計算する

datetime.timedeltaでは、1ヶ月後、1年後などを指定するとエラーになる
dateutil.relativedeltaを使うと加算・減算が可能


月末の日を計算する

dateutil.relativedeltaの1ヶ月後の計算を応用して月末の日を計算する
from datetime import datetime
from dateutil.relativedelta import relativedelta
time_cur = datetime(2021, 8, 1, 0, 0, 0)
time_new = time_cur + relativedelta(months=1) - relativedelta(days=1)
print(time_new)
2021-08-31 00:00:00が表示される


年初からの日数を計算する

datetimeの演算を利用する
from datetime import datetime
doy = (datetime(2021, 6, 21) - datetime(2021, 1, 1)).days
print(doy)
171が表示される(1/1が0、1/2が1、、、で計算されたもの)


当日の00UTCを取得する

datetime.utcnowで取得した現在時刻を書き換える
from datetime import datetime
time = datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0)
時、分、行、マイクロ秒を全て0に書き換え当日の00UTCにする


年初の00UTCを取得する

当日の00UTCを取得する同様に、datetime.utcnowで取得した現在時刻を書き換える
from datetime import datetime
time = datetime.utcnow().replace(month=1, day=1, hour=0, minute=0, second=0, microsecond=0)
月を1月、日を1日とし、時、分、行、マイクロ秒を全て0に書き換え年初の00UTCにする


ISOフォーマットで表示する

datetime.datetimeのisoformatメソッドを利用する


時間方向のループを回す

多重ループは遅くなるので時刻変数は1つのみとし、timedeltaを足して時刻を進める


毎日の同じ時刻の計算

開始時刻(1970-01-01 00:00:00)からの差を1日で割った余りを求める


ディレクトリ、ファイル

ディレクトリのパスを結合する

os.path.joinを使う
import os
dir1 = "dir_name1"
dir2 = "dir_name2"
dir_path = os.path.join(dir1, dir2)
dir_pathには、UNIX環境ではdir_name1/dir_name2が入る
UNIX環境では/、Windows環境では¥が設定されるので、OSに依存しないコードが書ける


ディレクトリ、ファイルが存在するか確認する

os.path.existsを使う
import os
os.path.exists("ディレクトリ、ファイルのパス")
存在すればTrueが返る


ディレクトリ内の一覧を取得する

os.listdirを使うと、ディレクトリ内のファイル、サブディレクトリ一覧を取得できる


ワイルドカードで一覧を取得する

glob.glob関数を使うと、UNIXライクなワイルドカードで一致するファイル、ディレクトリを取得できる
import glob
files = glob.glob("ワイルドカードを含む記述")
直下のtest1/*.txtをリストにする
import glob
files = glob.glob("test1/*.txt")


ディレクトリ、ファイルの所有者、グループを変更する

os.chownを使う
import os
os.chown("ディレクトリ、ファイル名", uid, gid)
*指定されたuid、gid(整数型)に変更する
*いずれかを変更しない場合には、-1を指定する


ディレクトリを作成する

os.makedirsを使う
import os
os.makedirs("ディレクトリのパス")
*mkdir -p同様に、存在しない場合には親ディレクトリも作成する


ディレクトリ、ファイルを削除する

os.removeを使う
import os
os.remove("削除するディレクトリ、ファイルのパス")
*ディレクトリの場合、rm -r ディレクトリのパス と同じ動作をする(ディレクトリごと削除)


シンボリックリンクを作成する

os.symlinkを使う
import os
os.symlink("リンク元のパス", "リンク先のパス")


ディレクトリ、ファイルをコピー、移動する

shutilを使う


カレントディレクトリを移動する

os.chdirを使う
import os
os.chdir("移動先のパス")


環境変数、パス

環境変数を取得する

os.environ.getを使う


環境変数を追加・上書きする

os.environを使う

pythonパッケージへのパスを追加する

sys.path.appendを使う

コマンドにパスが通っているか確認するる

shutil.whichを使う
import shutil
shutil.which("コマンド名")
*コマンドにパスが通っていれば、パスが表示される。

パスが通っていない場合の処理を指定する場合
import shutil
if shutil.which("コマンド名") is None:
    print("Not Found: コマンド名")
*パスが通っていない場合Noneを返すのを利用する


文字列

大文字と小文字の変換

文字列のメソッドを利用する


文字列から改行記号を取り除く

文字列のメソッドを利用する


文字列からboolへの変換

文字列が"true"、"t"、"yes"、"1"のいずれかの場合にTrueとする。大文字・小文字を区別しないようにするため、lower()で小文字に変換している
b = "文字列".lower() in ["true", "t", "yes", "1"]
bにはTrueかFalseが入っている


条件式

pythonにおける真偽値の判定



全ての要素がTrueか判定する

allを用いる
print(all([True, True, True]))
出力:True
print(all([True, True, False]))
出力:False
*全てTrueの時のみTrueが表示される
*allの引数には、リスト、タプル、集合が使用可能
参考:Pythonの組み込み関数all(), any()の使い方


いずれかの要素がTrueか判定する

anyを用いる
print(any([True, False, False]))
出力:True
print(any([False, False, False]))
出力:False
*1つでもTrueが含まれていればTrueが表示される
*allの引数には、リスト、タプル、集合が使用可能


全ての要素がFalseか判定する

not anyを用いる
print(not any([False, False, False]))
出力:True
print(not any([False, False, True]))
出力:False
*anyの否定を取ることで、全ての要素がFalseの場合を判定できる
*allの引数には、リスト、タプル、集合が使用可能


オブジェクト同士の比較

isinstence関数を用いる
isinstance(object, classinfo) 
1番目の引数のオブジェクトが、2番目の引数で指定したデータ型のオブジェクトかサブクラスのオブジェクトの場合にTrueとなる


リスト

pythonにおけるリスト

要素を順番に並べたもので中身を変更・追加・削除可能。要素の型はまちまちでも良く、リストの要素に文字列、整数、実数などの他、リストやタプル、Numpyの配列などオブジェクトは何でも入れられる。


リストの作成

リストを作成する場合、次のように記述する
list_a = [1, 2, 4, 'a', 'b', 'c']
要素が空のリストも作成可能
list_a = []
list_b = list()

リストの要素の変更

リストの要素番号を指定して値を置き換えることが可能
list_a[1]=3
print(list_a)
出力:[1, 3, 4, 'a', 'b', 'c']

リストへの追加

リストの.appendを使う
list_a.append(5)
print(list_a)
出力:[1, 3, 4, 'a', 'b', 'c', 5]

リスト同士の結合

リストの.extendを使う
list_a = [1, 2, 4, 'a', 'b', 'c']
list_b = [5, 7, 10, 'd', 'e', 'f']
list_a.extend(list_b)
print(list_a)
出力:[1, 2, 4, 'a', 'b', 'c', 5, 7, 10, 'd', 'e', 'f']
*extendではなくappendを使うと、リストの中にリストが入る
list_a = [1, 2, 4, 'a', 'b', 'c']
list_b = [5, 7, 10, 'd', 'e', 'f']
list_a.append(list_b)
print(list_a)
出力:[1, 2, 4, 'a', 'b', 'c', [5, 7, 10, 'd', 'e', 'f']]

リスト内包表記

リストの要素を個別にstrに変換する場合
[str(x) for x in list_a]

集合

pythonにおける集合

集合を作成する場合は、set()か{}を用いる。
set_a = set("abc")
print(set_a)
*{'a', 'b', 'c'}が表示される


集合同士の演算

集合同士の演算が可能
set_a = set("abc") # {'a', 'b', 'c'}
set_b = set("cde") # {'c', 'e', 'd'}
print(set_a & set_b) # and演算
出力;{'c'}
print(set_a | set_b) # or演算
出力:{'b', 'c', 'e', 'd', 'a'}
print(set_b - set_a) # 集合の差
出力: {'e', 'd'}
print(set_a - set_b) # 集合の差
出力: {'b', 'a'}


Web

pythonでwebサーバを起動

Webページのコンテンツのある場所で以下のコマンドを実行する。
% python3 -m http.server 8000
ブラウザから次のようにアクセスする。
http://localhost:8000
*テスト環境での使用を想定しており、公開サーバとはすべきではない


ファイルをダウンロードする

urllib.requestを用いる
import urllib.request
urllib.request.urlretrieve("URL", "保存するファイルのパス")


ダウンロードにリトライ回数を設定する

再帰関数を用いる
import urllib.request
def download(cnt=2):
    if cnt <= 0:
        raise RecursionError('maximum recursion count exceeded')
    try:
        urllib.request.urlretrieve("URL", "保存するファイルのパス")
    except OSError:
        time.sleep(10.0)  # 10秒間待つ
        download(cnt=cnt - 1)  # cntを減らして再帰


設定ファイル

設定ファイルの形式

次のように[セクション]で区切られ、各セクションに複数のキーと値のペアが配置されている。
[Default]
SHELL = /bin/bash
TERM = xterm-256color
LANG = ja_JP.UTF-8

[filenames]
InputFileName = input.txt
OutputFileName = output.txt


設定ファイルの読み込み

設定ファイルをconfig.iniとして保存したものを読み込む例。
import configparser
config = configparser.ConfigParser()
config.read("config.ini")


設定ファイルの書き出し

設定ファイルをconfig.iniとして出力するmkconfig.pyを作成する。
#!/usr/bin/env python3
import configparser
config = configparser.ConfigParser()

config['Default'] = {
    'SHELL': '/bin/bash',
    'TERM': 'xterm-256color',
    'LANG': 'ja_JP.UTF-8'
}

config['filenames'] = {
    'InputFileName': 'input.txt',
    'OutputFileName': 'output.txt'
}

# 書き出し
with open('config.ini', 'w') as f:
    config.write(f)
*出力されたファイルでは、次のようにキーが全て小文字となる。
[Default]
shell = /bin/bash
term = xterm-256color
lang = ja_JP.UTF-8

[filenames]
inputfilename = input.txt
outputfilename = output.txt


例外処理の概要

例外処理の概要

すべての例外は BaseException(例外の基底クラス)から派生するが、BaseExceptionはユーザのコードでは使用しない
コード中で例外を検出、生成する場合には、Exceptionから派生した組み込み例外を用いる
例えば、モジュールのロードで問題が発生した場合には、ImportError、ファイルが存在しない、ディスク容量超過などシステム関連のエラーは OSError、など
詳細については、組み込み例外参照


例外処理の記述方法

OSErrorの場合
try:
    処理内容(ファイルを開けるなど)
except OSError as e:
    raise OSError(e)
OSErrorの内容を表示する
exceptのみでも動作するが、PEP8では組み込み例外の名前を記載することになっている


例外を補足し終了コードを返す

スクリプトの最上位で例外を補足し、終了コードを返す場合
if __name__ == "__main__":
    try:
        main()
    except Exception:
        raise SystemExit(-1)
    raise SystemExit(0)
main関数が正常終了した場合は0、異常終了した場合は-1を返す


subprocessの例外を補足する

subprocessの終了コードを判定する
com_list = ['コマンド', 'オプション1', 'オプション2', ...]
try:
    res = subprocess.run(com_list,
          stdout=subprocess.PIPE,
        stderr=subprocess.PIPE)
except Exception:
    exception = sys.exc_info()[1]
    raise Exception(exception)
if res.returncode != 0:
    raise Exception(Abort with return code ' + str(res.returncode))


外部コマンド

外部コマンドの実行

subprocess.runを使う
import subprocess
subprocess.run("コマンド", "引数1", "引数2", ...)


シェルを利用した外部コマンドの実行

subprocess.runでshell=Trueとする
import subprocess
subprocess.run("コマンド 引数1 引数2", shell=True)
パイプも使用可能
subprocess.run("コマンド1 引数1 引数2 | コマンド2", shell=True)
*shell=Trueでは、実行者の権限で任意のシェルコマンドを実行できてしまうので、使用は最小限に抑え、外部からの任意の入力を渡すことは避ける


外部コマンドの戻り値を取得する

subprocess.runの戻り値を利用する
import subprocess
res = subprocess.run("コマンド", "引数1", "引数2", ..., stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(res.stdout.decode("utf-8")) # 標準出力の表示
print(res.stderr.decode("utf-8")) # 標準エラー出力の表示
print(str(res.returncode)) # 終了ステータスの表示
*pyton3標準のUTF-8への変換を行なっている


その他

QRコードを生成する

pyqrcodeを使う(pngで書き出す際はpypngも必要)。MacPortsの場合には、
% sudo port install py311-pypng py311-pyqrcode
py311の部分はpythonのバージョンに合わせて変更する。次のようにQRコードを生成する。
import pyqrcode
# QRコード生成
code = pyqrcode.create("URLやメールアドレスなど", error='L', version=3, mode='binary')
# pngで保存
code.png("ファイル名.png", scale=5, module_color=[0, 0, 0, 128], background=[255, 255, 255])


base64でエンコードする

base64を使う。MacPortsの場合には、
% sudo port install base64
次のように文字列をbase64に変換する。
import base64
enc = base64.b64encode('文字列')

DIASで提供されているJRA-3Q(doi:10.20783/DIAS.645)のダウンロードスクリプトに適用する場合






[top]