[Python] 262 subprocessモジュール2 日付を出力 続編

[macOS Catalina 10.15.7]

前記事でBashにて3日後の日付を出力させるのに苦労しましたが、仕切り直しで再調査したところあっさり解決しました。

info dateコマンドで出力されるドキュメントが参考になりました。やはり分からなければ開発元のドキュメントを読むのが基本ですね。

UNIXのタイプによってルールが全く異なるというのがよく分かりました。ちなみにmacOSはBSDベースです。

import subprocess
from subprocess import PIPE

# 3日後の場合 Bash
com_date_3 = subprocess.run("date -v+3d +%y%m%d", shell=True, stdout=PIPE, stderr=PIPE, text=True)
date_3 = com_date_3.stdout

print(f'date_3 {date_3}')
--------------------------------------------------

出力
--------------------------------------------------
date_3 210531

[Python] 261 subprocessモジュール1 日付を出力

[macOS Catalina 10.15.7]

Bashのコマンドで日付を出力させてみました。

今日の日付は特に問題ないですが、3日後の書き方でドハマりしました。

とりあえず出力できましたが、他にスマートな書き方がないのであればこの使い方ではBash&macOSは却下です。

Zshにすれば普通になるのでしょうか。

import subprocess
from subprocess import PIPE
import datetime

# 今日の日付 Bash
com_date = subprocess.run("date +%y%m%d", shell=True, stdout=PIPE, stderr=PIPE, text=True)
date = com_date.stdout

print(date)

# 今日の日付 Python
date_today = datetime.date.today()
date_today_str = date_today.strftime('%y%m%d')

print(date_today_str)

# 3日後の日付 Bash 時差+9-72=-63 このスクリプトは可読性低い
com_date_3 = subprocess.run("env TZ=JST-63 date +%y%m%d", shell=True, stdout=PIPE, stderr=PIPE, text=True)
date_3 = com_date_3.stdout

print(f'date_3 {date_3}')

# 3日後の日付 Python
days3 = datetime.timedelta(days = 3)
date_days3 = date_today + days3
date_days3_str = date_days3.strftime('%y%m%d')

print(f'date_days3_str {date_days3_str}')
--------------------------------------------------

出力
--------------------------------------------------
210527
210527
date_3 210530
date_days3_str 210530

[Python] 260 chromedriverのバージョン管理 Homebrew編

[macOS Catalina 10.15.7]

これまではseleniumが動かなくなるたびにGoogle Chromeのサイトから最新のchromedriverをダウンロードして配置していましたが、あまりにも非効率なのでHomebrewのchromedriverを使うことにしました。

以下、関連コマンド等を記しておきます。

chromedriverのインストール

brew install chromedriver

# .bash_profileに追記
export PATH="/opt/homebrew/bin:$PATH"

# インストール先の例(オリジナル)
/usr/local/Caskroom/chromedriver/[Chromeのバージョン番号]/chromedriver
/opt/homebrew/Caskroom/chromedriver/[Chromeのバージョン番号]/chromedriver

# エイリアス配置先の例
/usr/local/bin/chromedriver
/opt/homebrew/bin/chromedriver

brewのインストール先を確認

brew --prefix

chromedriverの最新バージョンと導入有無の確認

brew info chromedriver

chromedriverのアップデート(毎日crontabで定期実行)

brew upgrade chromedriver

Pythonコード内の記述

from selenium import webdriver

driver = webdriver.Chrome()

[Python] 259 pyenv 2.0.0に関する警告

pyenvを2.0.0にバージョンアップするとターミナル起動時に以下の警告が表示されるようになりました。

WARNING: `pyenv init -` no longer sets PATH.
Run `pyenv init` to see the necessary changes to make to your configuration.

調べたところpyenvコマンドのオプションが変更になったようです。

.bash_profileを以下のように変更すると警告は出なくなりました。3行目だけ手を入れてます。

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"

ちなみに以前はこのように記述していました。

eval "$(pyenv init -)"

[Python] 258 pyenv仮想環境にanacondaを導入

これまで簡単なコードの検討にはIDLEの対話モードを使っていましたが、jupyterも便利そうなので試してみることにしました。

以下、pyenv仮想環境へのanaconda導入過程です。anacondaのjupyterを使うと主要なライブラリをインストールする手間がかかりません。

macOSでは現時点で最新のanaconda3-2021.05をインストールします。

# pyenv仮想環境にanaconda3-2021.05をインストール
pyenv install anaconda3-2021.05

# pyenvに入っているPythonのバージョンを確認する
pyenv versions
[出力]
  system
  3.7.4
  3.8.2
  3.8.3
  3.8.5
  3.8.6
  3.9.0
* 3.9.2 (set by /Users/[ユーザ名]/.pyenv/version)
  anaconda3-2021.05

# anacondaを使う専用ディレクトリnotebookを作成しカレントディレクトリを移動させる
cd ~/notebook

# notebookディレクトリでのみanacondaを使うように設定する
pyenv local anaconda3-2021.05

# anacondaで使えるPythonのバージョンを確認する
python -V
[出力]
Python 3.8.8

# jupyterを起動する
jupyter-notebook

[Python] 257 空のディレクトリを削除する 類例

前記事で紹介したコードの”glob.glob”が同語の繰り返しで何となく野暮ったいので少し表現を変えてみました。

importが1行増えますが、こちらの方が私の好みです。

import shutil,os
from glob import glob

dir_l = [dir for dir in glob('親ディレクトリのパス/*') \
if os.path.isdir(dir)]]
print(dir_l)

for dir in dir_l:
    file_l = [file for file in glob(dir + '/*')]
    print(file_l)
    if len(file_l) == 0:
        shutil.rmtree(dir)

[Python] 256 空のディレクトリを削除する

備忘のためメモ書き。

同じ階層にファイルがあっても削除されません。

import glob,shutil,os

dir_l = [dir for dir in glob.glob('親ディレクトリのパス/*') \
if os.path.isdir(dir)]]
print(dir_l)

for dir in dir_l:
    file_l = [file for file in glob.glob(dir + '/*')]
    print(file_l)
    if len(file_l) == 0:
        shutil.rmtree(dir)

[macOS] 30 ショートカットで今日の日付入力

macOSを使いこなしている方々からすれば目新しくないでしょうが、Automatorで日付入力(yymmdd)できるようにしました。

設定方法

1.Automatorを起動し設定する。コマンドは以下のとおり。クイックアクション名は仮に”きょう”とする。

export LC_ALL=en;
date +%y%m%d;
export LC_ALL=;

2.[システム環境設定]-[キーボード]-[ショートカット]-[サービス]から”きょう”を探し、適当なショートカットを登録する。
設定ファイルのパスは、/Users/[ユーザ名]/Library/Services/きょう.workflow

これで日付が簡単に入力できるようになりました。日付入りのファイルを量産している身としては大きな進歩です。

[Python] 254 CSVファイルのリスト化

Excelで作成したCSVファイルの先頭にBOM(byte order mark)が付いていたのでこれを削除する方法も併せて以下に記します。

with open(CSVファイルのパス,encoding='utf-8-sig') as f:
    reader = csv.reader(f)
    l = [row for row in reader]

# ネストになっているため平滑化
keys = [e for ele in l for e in ele]
print(keys)

以下のコードでも可能ですが、野暮ったい感じになります。

with open(CSVファイルのパス) as f:
    reader = csv.reader(f)
    l = [row for row in reader]

keys = [e.replace('\ufeff','') for ele in l for e in ele]
print(keys)