Pythonチュートリアル #5 -python良すぎない？-

※以下の企画です

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

今回は7章をやっていきます。
7章は「入出力」というタイトルで、文字列やらファイル処理を学べそうな雰囲気です。
前回学習した「モジュール」よりも、足元すぐに役立ちそうな気がしており楽しみです。
それではやっていきますぅ。

# 7章 学習内容まとめ
## フォーマット済み文字列リテラル（f文字列）
これは既に知っていて日常業務でも多用している文法（便利すぎる文法）だが、せっかく出てきたのでまとめておく。
**変数やテキストをミックスして文字列として扱いたいとき**には、冒頭に`f`を置いてシングルクォーテーション or ダブルクォーテーションで文字列全体を囲う。間に変数を組み込みたいなら`{}`で変数名を囲う。

``` python:フォーマット済み文字列リテラル
>> name_1 = 'alice'
>> name_2 = 'bob'
>> text = f'the main Character is {name_1}, and the second is {name_2}'
>> print(text)

the main Character is alice, and the second is bob
```

**これめっちゃ良くない？？？？？**

Opne AI APIとかでプロンプトをリクエストに載せるときとか、f文字列が無いとめちゃくちゃしんどいと思う。
また、オプションでフォーマットの揃え方も指定できるらしい。これは初めて知ったのでアツイ。

```python:f文字列のフォーマット指定

>> label = {'takeshi':100, 'yasuhiro':200, 'yasushi':300}
>> for name, number in label.items():
>>  print(f'{name:10}==>{number:5d}')

takeshi   ==>  100
yasuhiro  ==>  200
yasushi   ==>  300
```

変数を指定するときの`{変数名}`を`{変数名:最小文字数}`と指定できる。足りない文字数文は空白でパディングされる。`5d`としている部分は**固定長整数(decimal)** のこと。
お察しの通り`5f`とすれば、最小5文字で小数として表示してくれる。
※几帳面な人がチャットワークなどで空白をいっぱい入れてキレイにしているアレを、自動で行える。

**良すぎない？**
**Python良すぎない？**

本書では`.format()`を用いたフォーマッティングも紹介されているが、**完全に個人の趣味であんまり受け付けないのでここで紹介はしない**。
こうやって好き嫌いをするから僕のような無能なエンジニアが生まれていくのです。ごめんなさい。

## ファイルの読み書き
なにかとCSVを開いて情報処理するケースは多く、`open()`関数はよく使う。
その場合はpandasでDataframe型として取り扱ってしまうことが多い（pandasが便利過ぎる）が、`open()`で十分ことも多い。
というか、`open()`のことをちゃんと理解していないというのが本音なのでここでちゃんと学んでおく。

### open()
`open()`の使い方は非常に単純で`open(<ファイル名>, <モード>)`とするだけ。
モードはいくつか種類があり…

| モード | 意味 |
|:-:|:-:|
|  r | 読み取り  |
|  w |  書き込み |
|  a | 追加  |
|  r+ | 読み書き  |
|  b | バイナリ  |

省略すると`r`になる。テキストを含まないデータなら原則`b`で開くことになる。
というのも、読み取りモードにしてしまうと、行末文字の`\n`（winなら`\r\n`）が保管されて全て`\n`になるらしい。知らなかった。
そうなるとJPEGやらEXEやらのデータを破壊することになりかねない。

```Python: openの使い方
>> f = open('test.csv', 'r')
```

### with open
必ずと言っても過言ではないほど`open()`と一緒に用いられるのが`with`というやつ。
なんとなく必要なんだよなという気持ちで使っていたが、`with`を使うと**ファイルをちゃんとcloseしてくれる**というもの。
C言語に触れたことがある人なら、その親切さにありがたみを感じると思う。

※withを使い忘れて、closeメソッドも忘れてしまったとしても、Pythonのガベージコレクションが効いて閉じてはくれるらしい

これはちゃんと作法として抑えておきたい。

```Python: with open
>> with open('test.csv', 'r') as f:
>>    f.read()
```

## ファイルオブジェクトのメソッドいろいろ
### read()
ファイルオブジェクトに対して`.read()`すると、中身をざっくり表示してくれる。
utf8のCSVファイルに対しては以下のように出力された。

```Python: read()
>> with open('test.csv', 'r') as f:
>>    data = f.read()
>> data

\ufeffname,age\ntakeshi,24\nmatsuko,25\nyoshi,18\nbomb,10
```
ちゃんと`print()`をつかってやると…
```Python: read()
>> with open('test.csv', 'r') as f:
>>    data = f.read()
>> print(data)

name,age
takeshi,24
matsuko,25
yoshi,18
bomb,10
```
改行コードが解釈されて整形される。


### write()
`read()`があるなら当然`write()`もある。
使い方は簡単で、まずはファイルオブジェクトを生成して、`.write('書き込みたいデータ')`とするだけ。
```Python: write
>> with open('test.csv', 'r') as f:
>>   data = f.read()

>> data = data + '\nkazuya,32\n'

>> with open('test.csv', 'w') as f:
>>   f.write(data)

>> print(data)

name,age
takeshi,24
matsuko,25
yoshi,18
bomb,10
kazuya,32
```

全上書きする感じの書き方が一番シンプルで、`.seek`でC言語で言うポインタ操作みたいなのをすると、データの挿入・追加処理もできるっぽい。
まぁ、基本はreadしたデータに処理を加えて最後に書き出すケースの方が多いので、これで十分かも。

**というかPandas使うわやっぱり**

# まとめ
簡易的なログ用に多用している`print`で使えそうな**フォーマット済み文字列**や、ファイルオブジェクトの取り扱いについて改めて学べて良かった。
最近はコツコツコード書くのも楽しくなってきて、"キラキラしていた頃の自分"を取り戻しつつある。と思う。
自分にとって非常に良い機会になっているので引き続きやっていくぞ〜〜〜〜