pythonのテキストデータ読込の仕組みとopen関数を整理する。

## 初めに。
どうもpython歴3か月の者です。
今回は一度学習してよく理解できずにスルーしていたデータ読込(テキストファイル)についてリベンジしたいと思います。
最初に学習した時より理解できたのでその忘備録やアウトプットにでも。
自分はpythonにおけるデータ読込の理解に苦労したので、このような方に少しでも楽になればと。

初めて学習した時面喰いましたよね。excelやwordを開く、みたいに簡単にいかないので。
ファイルをダブルクリックで出来る事が、pythonだと4行くらいのコードが必要だなんて。

### 環境
win11 / google colab
## 今回扱う参照コード
最初に今記事にて扱うコードを紹介致します。

①
```python
file = open("a.txt")
text = file.read()
print(text)
file.close
```

②
```python
with open("a.txt","r") as f:
  s = f.read()
  print(s)
```
③
```python
with open("a.txt","w") as f:
  s = f.write("bbbbb")
  print(s)
```
④
```python
with open("a.txt","a") as f:
  s = f.write("bbbbb")
 #s = f.write("/nbbbbb")
  print(s)
```
⑤
```python
with open("b.txt","x") as f:
  s = f.write("ddddd")
```

⑥
```python
import pandas as pd
df = pd.read_table("/content/a.txt")
df
```

## 学習
それでは学習を始めていきます。

### テキストデータの読込について。
参照コード①②

### ①のコード
- 事前準備。

"a.txt"というファイルを作成して適当な文字を記入し保存して下さい。
そしてそのテキストファイルを今回扱うpy/ipynbファイルと同ディレクトリに格納してください。
(a.txtを呼び出せる環境を構築する準備です。)

- 実装

前述でも触れた通り、私たちがテキストファイルを確認する時、対象をダブルクリックするだけですよね。<font color="red">そのようなmindを一旦捨てて頂ければ</font>と思います。
同じ動作をする為にpythonはこのようなコードを用いますので。
```python
file = open("a.txt")   #①
text = file.read()     #②
print(text)            #③
file.close             #④
```
これは何を意味しているでしょうか？説明致します。

1. でa.txtを開いています。この状態ではまだファイルを開いただけなので内容を読み込んでおりません。
1. ②でa.txtの内容を読み込んでtextという変数に格納しています。この状態でやっとデータが変数に格納されました。
1. ③でそのデータが格納された変数を出力しています。
1. ④で開いたファイルを閉じます。word.excel終了時にバツボタンで閉じますよね。このイメージで。

いかがでしょうか？伝わりましたかね？多分以前の私ならばこの説明でもピンとこなかったと思います。なので昨夜学習し思いついた例を出して再度説明致します。

```python
file = open("a.txt")     #本を開く。
text = file.read()       #本の内容を読む。
print(text)              #本の内容をoutputする。
file.close               #本を閉じる。
```
私はこの例でしっくりと来ました。いかがでしょうか。

### ②のコード

ここまでの感想はいかがでしょうか?
｢めんどくさい。｣｢たかがテキストファイルを確認するだけでこんな…使えんな。｣
こう思うのが普通だと思います。でも大丈夫、もっと簡単な方法があります。
それは<font color="red">open関数</font>です。
```python
with open("a.txt","r") as f:   #①
  s = f.read()                 #②
  print(s)                     #③
```
これでも同じテキスト読込に意味します。

それでは早速解説致します。
1. opne関数でa.txtを開きます。第一引数:"テキストファイル名"第二引数:モード
1. その開いたテキストファイルの内容を読み込んで変数に格納します。
1. そのデータが格納された変数を出力しています。

これがopen関数の使い方です。
- closeの必要がなく自動でcloseしてくれます。
- 第二引数の`r`とは？

openの引数として「ファイルを開いて何をするのか」を指定する必要があります。
今回はデータを読み込むので第二引数として`"r"(read)`を使いました。

## 他のopen関数の使用例。
参照コード③④⑤⑥

さて、先ほどopen関数を紹介させて頂きましたが、他にも有用な<font color="red">第二引数</font>が多々存在します。今回はその一部を紹介させて頂きます。

### ③のコード

第二引数を`w`とすることで、ファイルの内容を上書きする事が出来ます。

:::note info
書き足しではなく上書きです。
:::

```python
with open("a.txt","w") as f:
  s = f.write("bbbbb")
```
1. opne関数でa.txtを開きます。第一引数:"テキストファイル名"第二引数:モード
1. その開いたテキストファイルの内容を上書きします。今回は"bbbbbb"と上書きします。

これで先ほどのデータ読み込み方法にて内容を確認してみて下さい。
内容が上書きされている事が確認できます。

![2022-08-01_14h50_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/8da3b87a-854f-f4b3-8d34-4901aa726d6e.png)

### ④のコード

第二引数を`a`とすることで、ファイルの内容に書き足しを行う事が出来ます。

```python
with open("a.txt","a") as f:
  s = f.write("ccccc")
```
1. opne関数でa.txtを開きます。第一引数:"テキストファイル名"第二引数:モード
1. その開いたテキストファイルに内容を書き足します。今回は"ccccc"を書き足します。

結果を確認してみましょう。

![2022-08-01_14h55_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/07435604-06d0-9d7b-2830-1e3e9c003af8.png)

このようにすれば改行した状態で書き足す事も可能です。(windows)

![2022-08-01_14h56_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/16ad5438-1244-a373-6aec-9adbfbc05b87.png)

### ⑤のコード
多少応用も含まれておりますが是非。

```python
with open("b.txt","x") as f:
  s = f.write("ddddd")
```

このコードは`[b]というテキストファイルを作成して"ddddd"と書き込む`というコードです。
- [b]というテキストファイルの生成
- "ddddd"という文字の書き込み

を行っているという事です。このようにopen関数には
<font color="red">新たにテキストファイルを生成する</font>という側面も含まれています。

`既存のファイルを名前指定して開く`
`新たなテキストファイルに名前を付けて開く`
という２つの側面を持っている事を確認してください。

それではここで、第二引数`x`について解説させて下さい。
- これは新たにテキストファイルを生成して文字を書き込む際、
既存のテキストファイルに書き込まれる場合はエラーになる。という処理です。

つまり`既に存在している同じ名前の大事なファイルを間違って消してしまうような事態を避けることが出来ます`
具体れを申し上げますと、この場合はエラーになります。

```python
#エラー発生
with open("a.txt","x") as f:
  s = f.write("ddddd")
```
既にある`a.txt`というファイルを新たに生成して書き込む事はできませんと。
もしこの引数が<font color="red">xではなく、wの場合は</font>既存のa.txtの
内容が上書きされてしまう。という事です。

上書き事故を防ぎたいような慎重に扱いたい場合は有用です。

### ⑥のコード
pandasで開きます。
```python
import pandas as pd
df = pd.read_table("/content/a.txt")
df
```
あまりpandasでテキストファイルを扱う事はないでしょうが、
excel,csvのノリでテキストファイルも読み込めてしまいます。参考までに。
## 終わりに
いかがでしょうか。後半はoprn関数ばかりでしたね。
このようにデータを開く際のコードは多岐にわたります。なので`自分の使うスタイルだけ覚えよう`と考えるかもしれません。分かります。しかしそうもいかないですよね。様々な人のコードに触れる機会は多いですから。ネットで検索したりコードレビューしたり、その際面喰わないように見かけたらイメージが湧いてスムーズに調べられるぐらいのストックは持っていて良いかも知れません。