私的AI研究会 >MyLibrary
適宜再利用できそうなプログラムをライブラリ化する。
旧「Python 汎用ライブラリ作成」ページを改訂し継続する。
各プロジェクトでテスト運用後、「mylib」ディレクトリに置く。
Windows の場合
PYTHONPATH = X:/anaconda_win/workspace_py37/mylib
Linux の場合
export PYTHONPATH=$PYTHONPATH:$HOME/workspace_py37/mylib
標準モジュールの「logging」フォーマットを『短/普通/詳細』の3種類に規定してプログラム開発で共通/簡単に使用できるようにする。
値 | ログレベル | 出力フォーム | 例 |
-1 | ERROR | 詳細 | 2022-06-30 19:52:36,892 __main__:12 <module> [ERROR]: error |
0 | DEBUG | 短 | Process Start! |
1 | DEBUG | 普通 | logtest:8 [INFO]: Process Start! |
2 | DEBUG | 詳細 | 2022-06-30 19:55:57,085 __main__:8 <module> [INFO]: Process Start! |
3 | INFO | 短 | Process Start! |
4 | INFO | 普通 | logtest:8 [INFO]: Process Start! |
5 | INFO | 詳細 | 2022-06-30 19:55:57,085 __main__:8 <module> [INFO]: Process Start! |
種類 | レベル | 内容 | 対応するメソッド |
DEBUG | 10 | デバッグに必要な情報 | debug() |
INFO | 20 | 想定される処理が行われた事を知らせる | info() |
WARNING | 30 | 想定外の事が起きた場合、もしくはその予兆を知らせる | warning() |
ERROR | 40 | ある機能がエラーで実行できなかったことを知らせる | error() exception() |
CRITICAL | 50 | 何らかの原因(エラー含む)で処理が継続できず中断したことを知らせる | critical() |
$ python3 my_logging.py 2022-07-04 14:11:37,789 __main__:90 <module> [ERROR]: error
$ python3 my_logging.py 1 my_logging:86 [INFO]: Process Start! my_logging:87 [DEBUG]: debug my_logging:88 [INFO]: info my_logging:89 [WARNING]: warning my_logging:90 [ERROR]: error my_logging:91 [INFO]: Process End!
$ python3 my_logging.py 2 2022-07-04 14:11:44,726 __main__:86 <module> [INFO]: Process Start! 2022-07-04 14:11:44,726 __main__:87 <module> [DEBUG]: debug 2022-07-04 14:11:44,726 __main__:88 <module> [INFO]: info 2022-07-04 14:11:44,726 __main__:89 <module> [WARNING]: warning 2022-07-04 14:11:44,726 __main__:90 <module> [ERROR]: error 2022-07-04 14:11:44,726 __main__:91 <module> [INFO]: Process End!
$ python3 my_logging.py 3 Process Start! info warning error Process End!
$ python3 my_logging.py 4 my_logging:86 [INFO]: Process Start! my_logging:88 [INFO]: info my_logging:89 [WARNING]: warning my_logging:90 [ERROR]: error my_logging:91 [INFO]: Process End!
$ python3 my_logging.py 5 2022-07-04 14:11:55,210 __main__:86 <module> [INFO]: Process Start! 2022-07-04 14:11:55,210 __main__:88 <module> [INFO]: info 2022-07-04 14:11:55,210 __main__:89 <module> [WARNING]: warning 2022-07-04 14:11:55,210 __main__:90 <module> [ERROR]: error 2022-07-04 14:11:55,210 __main__:91 <module> [INFO]: Process End!
ANSI エスケープシーケンスを利用してターミナル標準出力をカラー化する。
色 | コマンド | ESCコード |
GREEN | printG | \033[1;32m |
RED | printR | \033[1;31m |
YELLOW | printY | \033[1;33m |
CYAN | printC | \033[1;36m |
BLUE | printB | \033[1;34m |
NOKOLOR | printN | \033[0m |
$ python3 my_print.py --- My Print test --- green --- My Print test --- red --- My Print test --- yellow --- My Print test --- cyan --- My Print test --- blue --- My Print test --- normal
標準パッケージ「detetimwe」を利用して汎用モジュールを作成。
機能 | 関数 |
現在の日時文字列を得る | now_strftime(form) |
日時の差を計算 | time_difference(time, time_now) |
日時文字列のチェック | time_check(time1, time2, delta=10) |
$ python3 my_datetime.py my_datetime:54 [INFO]: now_strftime() >> 2022/07/04 16:32:44 my_datetime:60 [INFO]: time_difference() 2022/07/03 23:59:20 - 2022/07/04 00:00:20 >> day = 0, seconds = 60 my_datetime:66 [INFO]: time_difference() 2022/07/03 00:00:20 - 2022/07/04 00:00:20 >> day = 1, seconds = 0 my_datetime:72 [INFO]: time_check() 2022/07/03 23:59:59 - 2022/07/04 00:00:09 >> False my_datetime:78 [INFO]: time_check() 2022/07/03 23:59:59 - 2022/07/04 00:00:10 >> True
文字色(白)に対して視覚的な背景色・ボーダーの配色例。
機能 | 関数 |
RGB 背景色を得る | get_back_rgb80(index) |
RGB ボーダー色を得る | get_boder_rgb80(index) |
BGR 背景色を得る | get_back_bgr80(index) |
BGR ボーダー色を得る | get_boder_bgr80(index) |
$ python3 my_color80.py
OpenCV のテキスト出力 cv2.puttext は日本語出力ができないのをカバーする。
機能 | 関数 | 戻り値 |
OpenCV 文字描画 | cv2_putText(img, text, org, fontFace, fontScale, color, mode=0) | img |
OpenCV 文字描画範囲を得る | cv2_putText(img, text, org, fontFace, fontScale, color, mode=0, areaf=True) | img, xmin, ymin. xmax, ymax |
$ python3 my_puttext.py
よく使う CSVファイル処理関連モジュールを 「CSVtreatmentクラス」として再利用しやすくする。
CSVファイル
column 0 column 1 ... column n row 0 data 0-0 data 0-1 ... data 0-n row 1 data 1-0 data 1-1 ... data 1-n : : : : : row n data n-0 data n-1 ... data n-n
機能 | 関数 |
クラスの初期化 | CSVtreatment(path, encoding = 'utf_8_sig', logsel) |
CSV ファイル書き込み | write_csv(row_data) |
CSV ファイル追加書き込み | append_csv(row_data) |
CSV ファイル読み出し | read_csv() |
CSV ファイルチェック key(col_0) = value(d0X) があるかを調べる | check_csv(key, value) |
CSV ファイル key(col_0) = value(d0X) 列の column値の読み出し | read_csv_row_value(key, value, column) |
CSV ファイル key(col_0) = value(d0X) 列の読み出し | read_csv_row(key, value) |
CSV ファイル 文字列リスト2読み出し | read_list2_csv() |
CSV ファイル 文字列リスト3読み出し | read_list3_csv() |
CSV ファイル 文字列リスト2書き込み | write_list2_csv(befor, after) |
CSV ファイル 文字列リスト3書き込み | write_list3_csv(list1, list2, list3) |
$ python3 my_csv.py
よく使うファイル処理関連モジュールを 「FileTreatmentクラス」として再利用しやすくする。
機能 | 関数 |
クラスの初期化 | FileTreatment(logsel) |
PDFファイルから画像ファイルを抽出する | pdf2img(fname) |
ファイルパスからファイル一覧を得る | get_file_list(dirpass) |
ファイルパスから拡張子で選択したファイル一覧を得る | get_file_list_sel(dirpass, sel_ext) |
ファイルを移動する XXXX/XXXXX.xxx ←→ XXXX-err/XXXXX.xxx | move_file(filename) |
-err フォルダのチェック | ckeck_erfolder(filename) |
ファイル末尾のチェック | ckeck_filetail(filename, ftail) |
ファイルを保存する XXXXX.xxx ←→ 'dname'/XXXXX.xxx | save_file(filename, dname = 'org') |
イメージファイルを時計回りに90°回転 | img_rotate90(filelist) img_rotate90_file(filename) |
イメージファイルを180°回転 | img_rotate180(filelist) img_rotate180_file(filename) |
イメージファイルを時計回りに270°回転 | img_rotate270(filelist) img_rotate270_file(filename) |
画像の種類を判別する | is_pict(filename) |
パラメータ | テスト内容 |
0 | PDFファイルからイメージファイルを抽出 |
1 | イメージファイルのリスト |
2 | イメージファイルを回転(270°) |
3 | ファイルを移動する XXXX/XXXXX.xxx ←→ XXXX-err/XXXXX.xxx |
4 | ファイルを保存する XXXXX.xxx ←→ 'dname'/XXXXX.xxx |
5 | ファイルの末尾を調べる |
6 | 画像の種類を判別する |
$ python3 my_filr.py {0/1/2/3/4/5/6}
設定ファイル等に利用される Yamlファイルの処理関連モジュールを 「YamlProcessクラス」として再利用しやすくする。
機能 | 関数 |
クラスの初期化 | YamlProcess(out_path, logsel) |
セクション/キーの追加書き込み | write_append_key(section, key, data) |
セクションの追加書き込み | write_append_key(section, data) |
セクションの書き込み | write_section(section, data) |
オブジェクトの書き込み | write_object(section, obj) |
セクション/サブ・セクション/キーの読み出し | load_section_sub_key(section, sub_sec, key) |
セクション/キーの読み出し | load_section_key(section, key) |
セクションの読み出し | load_section(section) |
オブジェクトの読み出し | load_object() |
(py37) $ python3 my_yaml.py my_yaml:83 [DEBUG]: UARTport: port: /dev/ttyUSB0 my_yaml:62 [DEBUG]: JTalkVoice: voice: 0 UARTport: port: /dev/ttyUSB0 my_yaml:62 [DEBUG]: JTalkVoice: voice: 0 MailServer: account: aipromotion999@gmail.com enable: 'No' from: aipromotion999@gmail.com host: smtp.gmail.com password: XXXXXXXXXX port: 465 to: XXXXXXXX@docomo.ne.jp UARTport: port: /dev/ttyUSB0 UARTport port : '/dev/ttyUSB0' <class 'str'> JTalkVoice voice : '0' <class 'int'> MailServer account : 'aipromotion999@gmail.com' <class 'str'> MailServer password : 'XXXXXXXXXX' <class 'str'> MailServer host : 'smtp.gmail.com' <class 'str'> MailServer port : '465' <class 'int'> MailServer from : 'aipromotion999@gmail.com' <class 'str'> MailServer to : 'XXXXXXXX@docomo.ne.jp' <class 'str'> MailServer enable : 'No' <class 'str'>
$ python3 my_fps.py 26.0 28.7 29.4 : 23.1 FPS average: 26.10
OpenCV で表示されたウインドウは標準では「X」ボタンが効かない。「X」ボタンでウインドウを閉じられるようにする。
※ バックエンドに Qtモジュールがない場合は OpenCVからウインドウの状態取得ができないようなのでこの手法は動作しない。
$ python3 my_winstat.py
よく使う GUI ダイアログを使いやすくする。
ダイアログ表示の形状は動作するウインドウ環境に依存する。
機能 | 関数 |
ディレクトリ選択 | select_dir(msg = '', initdir = './') |
画像ファイル選択 | select_image_file(msg = '', initdir = './') |
画像/動画ファイル選択 | select_image_movie_file(msg = '', initdir = './') |
ディレクトリの選択ダイアログ | dir_dialog(ttl, mustex, initdir) |
ファイルの選択ダイアログ | file_dialog(ttl, types, initdir) |
「情報」メッセージ・ダイアログ | info_dialog(ttl, msg) |
「警告」メッセージ・ダイアログ | warning_dialog(ttl, msg) |
「エラー」メッセージ・ダイアログ | error_dialog(ttl, msg) |
「はい・いいえ」メッセージ・ダイアログ | yesno_dialog(ttl, msg) |
「はい・いいえ」メッセージ・ダイアログ | question_dialog(ttl, msg) |
「OK・キャンセル」メッセージ・ダイアログ | okcancel_dialog(ttl, msg) |
「再試行・キャンセル」メッセージ・ダイアログ | retrycancel_dialog(ttl, msg) |
入力ダイアログ | input_dialog(ttl, msg) |
パラメータ | テスト内容 |
0 | ディレクトリ選択 select_dir() |
1 | 画像ファイル選択 select_image_file() |
2 | 画像/動画ファイル選択 select_image_movie_file() |
3 | 「情報」メッセージ・ダイアログ info_dialog() |
4 | 「警告」メッセージ・ダイアログ warning_dialog() |
5 | 「エラー」メッセージ・ダイアログ error_dialog() |
6 | 「はい・いいえ」メッセージ・ダイアログ yesno_dialog() |
7 | 「はい・いいえ」メッセージ・ダイアログ question_dialog() |
8 | 「OK・キャンセル」メッセージ・ダイアログ okcancel_dialog() |
9 | 「再試行・キャンセル」メッセージ・ダイアログ retrycancel_dialog() |
10 | 入力ダイアログ input_dialog() |
$ python3 my_dialog.py 0 my_dialog:131 [DEBUG]: select_dir: ()
$ python3 my_dialog.py 1 my_dialog:136 [DEBUG]: select_image_file: ()
$ python3 my_dialog.py 2 my_dialog:141 [DEBUG]: select_image_movie_file: ()
$ python3 my_dialog.py 3 my_dialog:148 [DEBUG]: info_dialog: ok
$ python3 my_dialog.py 4 my_dialog:155 [DEBUG]: warning_dialog: ok
$ python3 my_dialog.py 5 my_dialog:162 [DEBUG]: error_dialog: ok
$ python3 my_dialog.py 6 my_dialog:169 [DEBUG]: yesno_dialog: False
$ python3 my_dialog.py 7 my_dialog:176 [DEBUG]: question_dialog: no
$ python3 my_dialog.py 8 my_dialog:183 [DEBUG]: okcancel_dialog: False
$ python3 my_dialog.py 9 my_dialog:190 [DEBUG]: retrycancel_dialog: False
$ python3 my_dialog.py 10 my_dialog:197 [DEBUG]: input_dialog: None
位置設定可能なメッセージボックスを作成する。
ダイアログ表示の形状は動作するウインドウ環境に依存する。
位置指定しない場合はスクリーンの中央に配置される。
機能 | 関数 |
「情報」メッセージ・ダイアログ | info_dialog(titl, msg, x = -1, y = -1) |
「はい・いいえ」メッセージ・ダイアログ | yesno_dialog(titl, msg, x = -1, y = -1) |
「Yes・No」メッセージ・ダイアログ | question_dialog(titl, msg, x = -1, y = -1) |
「OK・Cancel」メッセージ・ダイアログ | okcancel_dialog(titl, msg, x = -1, y = -1) |
「再試行・キャンセル」メッセージ・ダイアログ | retrycancel_dialog(titl, msg, x = -1, y = -1) |
入力ダイアログ | input_dialog(titl, msg, x = -1, y = -1, init = '') |
入力ダイアログ2 | input_dialog2(titl, msg, x = -1, y = -1, text1 ='1', text2='2', init1', init2) |
スクリーンのサイズを得る | get_display_size() |
スクリーンの中央配置座標を得る | get_center_offset(width, height) |
スクリーンの中央配置座標を得る (内部利用) | _get_dialog_offset(width, height, x, y) |
パラメータ | テスト内容 |
0 | スクリーンのサイズを得る get_display_size() |
1 | スクリーンの中央配置座標を得る get_center_offset() |
2 | 入力ダイアログ(位置指定) input_dialog() |
3 | 入力ダイアログ(中央配置) input_dialog() |
4 | 「情報」メッセージ・ダイアログ info_dialog() |
5 | 「はい・いいえ」メッセージ・ダイアログ yesno_dialog() |
6 | 「Yes・No」メッセージ・ダイアログ question_dialog() |
7 | 「OK・Cancel」メッセージ・ダイアログ okcancel_dialog() |
8 | 「再試行・キャンセル」メッセージ・ダイアログ retrycancel_dialog() |
9 | 入力ダイアログ(初期値あり) input_dialog() |
10 | 入力ダイアログ2(初期値・入力名あり) input_dialog2() |
$ python3 my_movedlg.py 0 my_movedlg:293 [DEBUG]: get_display_size() height: 1051 width: 1680
$ python3 my_movedlg.py 1 my_movedlg:298 [DEBUG]: get_center_offset() x-offset: 665 y-offset: 475
$ python3 my_movedlg.py 2 my_movedlg:304 [DEBUG]: input_dialog() retuan value:
$ python3 my_movedlg.py 3 my_movedlg:308 [DEBUG]: input_dialog() retuan value:
$ python3 my_movedlg.py 4 my_movedlg:312 [DEBUG]: info_dialog () retuan value: ok
$ python3 my_movedlg.py 5 my_movedlg:316 [DEBUG]: yesno_dialog () retuan value: True
$ python3 my_movedlg.py 6 my_movedlg:320 [DEBUG]: question_dialog () retuan value: yes
$ python3 my_movedlg.py 7 my_movedlg:324 [DEBUG]: okcancel_dialog () retuan value: True
$ python3 my_movedlg.py 8 my_movedlg:328 [DEBUG]: retrycancel_dialog () retuan value: True
$ python3 my_movedlg.py 9 my_movedlg:333 [DEBUG]: input_dialog() retuan value: 初期値設定$ python3 my_movedlg.py 10 my_movedlg:419 [DEBUG]: input_dialog() retuan value: 初期値設定1, 初期値設定2 }}
$ python3 my_process.py
本関数は「my_movedlg.py」にも含まれている。
$ python3 my_screen.py Screen size: width x height = 1680 x 1051 (pixels)
SMTPサーバーを利用したメール送信パッケージ
機能 | 関数 | 入力パラメータ | |
MIME形式のメッセージ作成 | createMIMEText(入力パラメータ) | from_email | メールの送り主 |
to_email | メール送信先 | ||
message | メール本文 | ||
subject | メール・タイトル | ||
filepath | 添付ファイルパス | ||
filename | 添付ファイル名 | ||
メール送信 | send_email(入力パラメータ) | msg | MIME形式メッセージ |
account | アカウント | ||
password | パスワード | ||
host | SMTPサーバー名 | ||
port | SMTPポート番号 |
MailServer: account: aipromotion999@gmail.com enable: 'No' from: aipromotion999@gmail.com host: smtp.gmail.com password: **** port: 465 to: XXXXXXXX@docomo.ne.jp
(py37w) PS > cd \anaconda_win\workspace_py37face_rec (py37w) PS > python .\my_mail.py my_mail:94 [DEBUG]: MailServer account : 'aipromotion999@gmail.com' my_mail:95 [DEBUG]: MailServer password : '****' my_mail:96 [DEBUG]: MailServer host : 'smtp.gmail.com' my_mail:97 [DEBUG]: MailServer port : '465' my_mail:98 [DEBUG]: MailServer from : 'aipromotion999@gmail.com' my_mail:99 [DEBUG]: MailServer to : 'XXXXXXXX@docomo.ne.jp' my_mail:105 [INFO]: subject : 'メールのテスト12' my_mail:106 [INFO]: message : 'Python によるメール送信のテスト【その2】です hostname : HP-ELITE800-OS from : aipromotion999@gmail.com to : XXXXXXXX@docomo.ne.jp'