ホーム > 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を使う


文字列

大文字と小文字の変換

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


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

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


文字列からboolへの変換

文字列が"true"、"t"、"yes"、"1"のいずれかの場合にTrueとする。大文字・小文字は区別しない。
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の引数には、リスト、タプル、集合が使用可能


集合

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秒間待つ
        downloadcnt=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への変換を行なっている






[top]