- Python を用いてファイルの入出力
- Binance 取引所での仮想通貨の取引記録を Excel ファイルとして export できるので、ここではその Excel ファイルを扱った
- 処理内容
- ほぼ同時に複数の約定が起こり取引記録が複数に分裂することが多々起こるため、それらの取引履歴を一つにまとめる
- Amount(仮想通貨数量), Total(基軸通貨に合わせた金額), Fee(手数料)を合計し出力
- (その他の列は各行同じなので変更なし)
- ほぼ同時に複数の約定が起こり取引記録が複数に分裂することが多々起こるため、それらの取引履歴を一つにまとめる
- 書いたことがない Python を使ってみる
- 実用的な File I/O ロジックを作る
- 今回作成した処理は今後の仮想通貨投資の経理処理で充分使っていけるものである
- コンテナでの環境構築練習
- コンテナ内で実行・デバッグの環境を整える
バージョン | memo | |
---|---|---|
Python | 3.10.4 | |
OpenPyXL | 3.0.9 | Excel ファイルを Python で扱うためのパッケージ |
Docker | 20.10.11 | |
Remote Containers | 0.234.0 | VScode 拡張。コンテナ内で VScode を動作させる(?)。デバッグなどの目的で導入。 |
- 複数ファイルに対応している
- 同名のファイルが既に/output に存在する場合は上書きされる(delete&create)
- /output に処理完了後の Exele ファイルが出力される
- コンテナを起動し、一度だけ処理を走らせ、コンテナを破棄する
- clone したディレクトリに移動
- image をビルドする
$ docker build --tag py-file-io .
- image 一覧を表示し、py-file-io の ID をコピー
$ docker images
- コンテナ起動=>処理実行=>コンテナ破棄
$ docker run -it --rm \
-v $(pwd)/src:/root/src \
-v $(pwd)/input:/root/input \
-v $(pwd)/output:/root/output \
[py-file-ioのimage ID]
- 結果
- input/sample.xlsx のファイルを処理して /output/sample.xlsx が生成される
- ソースをいじり、任意のタイミングで実行したい場合
- Remote Development(ms-vscode-remote.vscode-remote-extensionpack) を VScode にインストール
- Remote Development でコンテナに入る
- sample.py を開き VScode から実行する
- 例: 1000$の指値で通貨 XXX を 500$分購入
- 取引 1: 取引価額[1000$] 取引ペア[XXXUSDT] 取引数量[200$分]
- 取引 2: 取引価額[1000$] 取引ペア[XXXUSDT] 取引数量[30$分]
- 取引 3: 取引価額[1000$] 取引ペア[XXXUSDT] 取引数量[50$分]
- 取引 4: 取引価額[1000$] 取引ペア[XXXUSDT] 取引数量[220$分]
- 上記のように、売りたい人の発注数量により取引数量が決まるので取引が複数に分裂する
- これだと取引記録が見づらい上に、取引計算サービスにアップロードする際に取引数が大幅に増え、より高額なプランに変更する必要があり困っていた
- Excel 操作でよく使われる Python を言語に選択
- VBA を用いることも考えたが、Excel しか使えない言語より Python などメジャーな言語を扱うほうが後の汎用性が高いと判断
- ライブラリを調査し、一番メジャーと思われる OpenPyXL を選択
- メジャーなライブラリであれば資料も探しやすいため
- 今まで Node.js のバージョン管理に nvm などを利用したりしてきて、同じような仕組みは Python にもあると思われるが煩雑 & PC を買い替えたあとなどの環境の再構築が面倒なイメージがあった
- これまで何度か Docker で環境構築をしてきたので Python でも問題なくできた
- ローカルには OpenPyXL などをインストールしていないため VScode のデバッグ起動時にエラーとなっていた
- Remote Containers の設定方法を学び、コンテナ内で作業することでデバッグ環境を整えた
- 初めて導入してみたが、以下の点で有用だと感じた
- ローカルの VScode に拡張機能をインストールしたり個別の設定を弄る必要がない
- 複数の PJ を兼任することが多いので、PJ を切り替えるたびに拡張機能や設定を意識するのが面倒だった
- 特に Formatter の設定有無は PJ によってまちまちで、切り替えを忘れると保存時にコードの体裁がごっそり変わってしまったりして面倒に感じていた
- 設定ファイルを git 管理しておけば各メンバーの拡張機能 や VScode 設定を統一することができるのでテキストベースで設定のいじり方や導入すべき拡張機能などを書かなくてよくなりそう(今まで頑張って書いてきたが、今後はこの方法で不要にしたい。)
- 複数の PJ を兼任することが多いので、PJ を切り替えるたびに拡張機能や設定を意識するのが面倒だった
- ローカルの VScode に拡張機能をインストールしたり個別の設定を弄る必要がない
- Dockerfile に ENTRYPOINT を設定することで run 時にコマンドを動作させる
- run 時に --rm オプションをつけることで ENTRYPOINT のコマンド終了と共にコンテナを破棄させる