【Python】Pythonスクリプトで自分がよく使うフレーズのメモ-2023

# 今回の内容
Pythonスクリプトで自分がよく使うフレーズのメモを再度書き直しました。
番号を振っていますが、特に意味はなく順不同です。
勘違いや書き間違いがある可能性があります。気づいたことがありましたらコメントいただけると助かります。

## 【１】コマンドライン引数をリストとして取得

```
import sys
argv_list = sys.argv[1:]
```

## 【２】コマンドライン引数を扱う
【参考】
・[ArgumentParserの使い方を簡単にまとめた | Qiita](https://qiita.com/kzkadc/items/e4fc7bc9c003de1eb6d0)
・[argparse --- コマンドラインオプション、引数、サブコマンドのパーサー | Python 3.11.2 documentation](https://docs.python.org/ja/3/library/argparse.html)

```
import argparse

def get_args():
    parser = argparse.ArgumentParser('スクリプト説明')
    parser.add_argument('argv', nargs='*', help='引数の説明')
    parser.add_argument('-a','--aaa', help='サブ引数の説明')
    ## 引数に設定可能なオプション例
    # action='store_true' : その引数があればTrue、なければFalseを返す。
    # nargs='*' : 引数の数を指定。*は0個以上、+は1個以上。*や+のとき、値はリストとなる。
    # default='好きな値' : 引数を指定しなかったとき、この値になる。defaultのデフォルトはNone。
    # required = True : その引数を必須にする。
    # choices = ['選択肢１', '選択肢２']：指定可能な値を設定することができる。
    return parser.parse_args()

def main():
    args = get_args()
    argv_list = args.argv
    aaa = args.aaa

    ## 以下、何かしらの処理

main()
```

## 【３】スクリプトのあるディレクトリパスの取得
【参考】
・[Pythonで実行中のファイルの場所（パス）を取得する__file__ | note.nkmk.me](https://note.nkmk.me/python-script-file-path/)

・os
```
import os
script_dir = os.path.dirname(os.path.abspath(__file__))
```

・pathlib
```
import pathlib
script_dir = pathlib.Path(__file__).resolve().parent
```

※参考までに、bashスクリプトの場合
```
script_dir=$(cd $(dirname $0) && pwd)
```

## 【４】ホームディレクトリ取得
【参考】
・[pythonでホームディレクトリの取得 | Qiita](https://qiita.com/sotetsuk/items/d7b32b12f94a341c79a5)

```
import os
homedir = os.path.expanduser("~")
```


## 【５】ファイルパスの親ディレクトリ名、ファイル名、拡張子名
【参考】
・[Pythonでパス文字列からファイル名・フォルダ名・拡張子を取得、結合 | note.nkmk.me](https://note.nkmk.me/python-os-basename-dirname-split-splitext/)
・[Python, pathlibでファイル名・拡張子・親ディレクトリを取得 | note.nkmk.me](https://note.nkmk.me/python-pathlib-name-suffix-parent/)

・os
```
import os

filepath = '/path/to/file.ext'

dirpath = os.path.dirname(filepath)
dirname = os.path.basename(os.path.dirname(filepath))
filename =  os.path.basename(filepath)
stem, ext = os.path.splitext(os.path.basename(filepath))

## results
# dirpath = '/path/to'
# dirname = 'to'
# filename = 'file.ext'
# stem = 'file'
# ext = '.ext'
```

・pathlib
```
import pathlib

filepath = '/path/to/file.ext'

p_file = pathlib.Path(filepath).resolve()
dirpath = p_file.parent
dirname = p_file.parent.name
filename = p_file.name
stem = p_file.stem
ext = p_file.suffix.lstrip('.')

## results
# dirpath = '/path/to'
# dirname = 'to'
# filename = 'file.ext'
# stem = 'file'
# ext = 'ext'
```

## 【６】外部コマンド実行
【参考】
・[pythonのsubprocessで標準出力を文字列として受け取る | Qiita](https://qiita.com/yutake27/items/033155608d64eac0adc2)

```
import subprocess

cmd = "コマンド"
proc = subprocess.run(cmd, shell=True)

## 出力をテキストとして取得
proc = subprocess.run(cmd, shell=True, capture_output=True, text=True)
result = proc.stdout
```

## 【７】日付を文字列として取得
【参考】
・[Pythonで日付から曜日や月を文字列（日本語や英語など）で取得 | note.nkmk.me](https://note.nkmk.me/python-datetime-day-locale-function/)

```
import datetime
dt = datetime.datetime.now()
timestamp = dt.strftime('%Y-%m-%d')

## それぞれ取得
year = datetime.datetime.now().year
month = datetime.datetime.now().month
today = datetime.datetime.now().day

```



## 【８】テキストファイルかどうか判定
【参考】
・[How can I detect if a file is binary (non-text) in Python? - Stack Overflow](https://stackoverflow.com/questions/898669/how-can-i-detect-if-a-file-is-binary-non-text-in-python)

```
def is_text_file(file):
    def is_binary_string(Bytes):
        textchars = bytearray({7,8,9,10,12,13,27} | set(range(0x20, 0x100)) - {0x7f})
        result = bool(Bytes.translate(None, textchars))
        return result
    result = is_binary_string(open(file, 'rb').r\ead(1024))
    if result:
        return False
    else:
        return True
```


## 【９】テキスト読込・書き込み
【参考】
・[Pythonでファイルの読み込み、書き込み（作成・追記） | note.nkmk.me](https://note.nkmk.me/python-file-io-open-with/)

```
## テキストファイル読み込み
text_file = "/path/to/file"

with open(text_file) as f:
    text = f.read()

## テキストファイルをリストとして読み込み
with open(text_file) as f:
    text_l = [s.strip() for s in f.readlines()]

## テキストファイル書き込み
with open(text_file, mode='w') as f:
    f.write('文字列')
```


## 【１０】一時ディレクトリ
【参考】
・[Pythonで一時ディレクトリを作って安全に後始末する | Qiita](https://qiita.com/everylittle/items/aa7c6f612ff0a9db7f01)

```
import tempfile

with tempfile.TemporaryDirectory() as dname:
```

## 【１１】パスが存在するかどうか確認
【参考】
・[Pythonでファイル、ディレクトリ（フォルダ）の存在確認 | note.nkmk.me](https://note.nkmk.me/python-os-exists-isfile-isdir/)

```
import os
os.path.exists(filepath)
```