Pythonチュートリアル #9 -標準ライブラリ色々-

※以下の企画です

https://qiita.com/tatataichi/private/56936a028e625e62af8e

今回は10章と11章をやっていきます。
10章-11章は「標準ライブラリめぐり」というタイトルで、その名の通りosインターフェースなどのよく使うあれらの紹介がされそう。
ここらへんは離散的に知らなかったものとか、あえておさらいしておきたいことなどをまとめていこうと思う。
楽しみ〜

# 10章 学習内容まとめ
## OSインターフェース
`import os`で使うアレ。
ファイルを消したりコピーしたりと色々お世話になっている。
本書では「**日々のファイルやディレクトリの管理には`shutil`がおすすめ**」と記載があり、あまり使ったことがなかったので色々調べてみた。（これはosインターフェースではなさそう？）

### shutil
ファイルやディレクトリ管理で便利なインターフェースを提供してくれるライブラリ。
ファイルのコピーとか移動、削除をより感覚的に実行出来る。

```python:shutilの例
import shutil

# ファイルをコピー
shutil.copy("source.txt", "destination.txt")

# メタデータ（パーミッションなど）もコピー
shutil.copy2("source.txt", "destination.txt")

# ディレクトリ全体をコピー
shutil.copytree("source_directory", "destination_directory")

# ファイルまたはディレクトリを移動
shutil.move("source.txt", "destination_directory/")

# ディレクトリを圧縮
shutil.make_archive("archive_name", "zip", "directory_to_compress")

# アーカイブを展開
shutil.unpack_archive("archive_name.zip", "extract_to_directory")
```

圧縮とかディレクトリ全体のコピーとかはアツイ。
一応以下の違いがあるらしく（chat GPT談）、ファイル操作だけなら`shutil`でまとめても良いかなと思った。

| **特徴**             | **shutil**                                                 | **os**                                                        |
|----------------------|-----------------------------------------------------------|---------------------------------------------------------------|
| **目的**             | 高レベルなファイル・ディレクトリ操作（コピー、移動など） | 低レベルなファイルシステム操作（作成、削除、属性操作など）  |
| **機能の範囲**       | 複雑なタスクを簡単に実現（例: ディレクトリ全体のコピー）  | 基本的な操作（例: ファイルやディレクトリの作成、削除）        |
| **操作対象**         | ファイルとディレクトリ                                     | ファイル、ディレクトリ、プロセス                              |
| **補助的機能**       | アーカイブ作成、ディスク容量取得                           | 環境変数操作、プロセス制御                                   |
| **実装の柔軟性**     | 簡潔で高レベル                                            | カスタマイズ可能な低レベルAPI                                |

とまぁ、10章の内容はここらへんが目新しいところ。

# 11章学習内容まとめ
## 出力整形
`textwrap`を使うと、長文のテキストを指定した形式でキレイに出力できる。

```python:textwrap
import textwrap

>> doc = """
    Python is an interpreted, high-level, general-purpose programming language. Created by Guido van Rossum and first released in 1991, 
    Python's design philosophy emphasizes code readability with its notable use of significant indentation.
    Its language constructs and object-oriented approach aim to help programmers write clear, logical code for small and large-scale projects. 
    """
>> 
>> print(textwrap.fill(doc,40))
```

```terminal:出力結果
 Python is an interpreted, high-level,
general-purpose programming language.
Created by Guido van Rossum and first
released in 1991,  Python's design
philosophy emphasizes code readability
with its notable use of significant
indentation. Its language constructs and
object-oriented approach aim to help
programmers write clear, logical code
for small and large-scale projects.
```

こんな感じで、引数で渡した文字数毎に切り分けて出力できる。

## テンプレート
`String`モジュールには、編集を比較的自由に行える`Template`というクラスがある。
たまーに見かけていたが、パット見複雑そうだったので無視していたやつだ。
実のところ構造はシンプルで、**プレースホルダ（置き換え可能な記号）**として`$`を設置し`substitute`メソッドで置き換えを行う。
さすがに字面だけだと意味不明だと思うので、実際にコードを書いてみる（写経だけど）。

```python:Template
>> from string import Template
>> t = Template('${village}folk send $$10 to $cause.')
>> t.substitute(village='Nottingham', cause='the ditch fund')

Nottinghamfolk send $10 to the ditch fund.
```

`t`でインスタンス化する際に、`$`で指定されたプレースホルダー付きの文字列を設定する。
今回だと`${village}`と`$cause`。
ここで注意なのは、`$$10`はプレースホルダーではなく通貨記号としての`$`をエスケープしているだけだ。

結果として、`substitute`で指定された値に置き換わった文字列として出力されている。
実際にはロギングなどの場面で活用されることもあるらしい。
今後自分が意識的に使うかは怪しいが、人のコードを読むときなどのために覚えておこう。

## ログ取り
`logging`モジュールを使えば、細かくログ取りができる。
簡易的なアプリケーションであれば何でもかんでも`print`で表示してしまう弱々エンジニアの僕なので、ちゃんとここらへんもおさらいしておく…

```python:logging
>> import logging
>> logging.basicConfig(level=logging.INFO)
>> logging.info('情報メッセージ')
>> logging.warning('警告メッセージ')
>> logging.error('エラーメッセージ')
>> logging.critical('重大なエラーメッセージ')

INFO:root:情報メッセージ
WARNING:root:警告メッセージ
ERROR:root:エラーメッセージ
CRITICAL:root:重大なエラーメッセージ
```

こんな感じでシンプルに出力が可能。
logはlogファイルに出力しておいて、情報を蓄積なんてことがあると思う。
そんなときは以下のように記述していく。

```python:logファイル出力
>> logging.basicConfig(level=logging.INFO, filename="example.log",
                     format="%(asctime)s %(levelname)s:%(name)s:%(message)s")
>> logging.info("This is an INFO level log.")
```
こうすると、pyファイルと同一のディレクトリに「example.log」が出力されて、「日付＋ログ」の形式で保存されているはず。
ちゃんと使っていこう…

# まとめ
細々としたまとまりのない内容になってしまったが、そもそもそういう章なので…（逃）
今回だと`shutil`と`logging`については比較的学びがあったので、実務にも組み込んでいきたい。
特に`log`は超重要だと思うので、これはこれで別にちゃんと勉強しよう。

それでは次回も頑張っていきましょう〜