100日後にエンジニアになるキミ - 69日目 - プログラミング - ファイル操作について

昨日までのはこちら

[100日後にエンジニアになるキミ - 66日目 - プログラミング - 自然言語処理について](https://qiita.com/otupy/items/5828ac7450c5ba8d6931)

[100日後にエンジニアになるキミ - 63日目 - プログラミング - 確率について1](https://qiita.com/otupy/items/0196897ae4d2134794fa)

[100日後にエンジニアになるキミ - 59日目 - プログラミング - アルゴリズムについて](https://qiita.com/otupy/items/f1a5e81633b868f3b5ed)

[100日後にエンジニアになるキミ - 53日目 - Git - Gitについて](https://qiita.com/otupy/items/0abaad82a7f3fea73f1f)

[100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて](https://qiita.com/otupy/items/d1765f1541a104ed6133)

[100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて](https://qiita.com/otupy/items/7af17635d576677606dc)

[100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1](https://qiita.com/otupy/items/6d1e5453f530e07b7aec)

[100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1](https://qiita.com/otupy/items/2f71d5f9c754b29d9555)

[100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1](https://qiita.com/otupy/items/61a97863f6df14171994)

[100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1](https://qiita.com/otupy/items/cd2315dcb38671cfded0)

今回はファイルの読み込みについてで、言語はPython言語を用います。

## ファイルの読み込み

Pythonでファイルの読み込みをする方法はたくさんあります。

まずはデータファイルがどんな形式なのかによって方法が変わってきます。

### テキストファイル(.txt)

拡張子が`.txt`のものはテキストファイルです。
単純に文章を保存したものはテキストファイルで、文章の長さなどの決まりはなく
改行を入れると複数行をファイルにまとめることができます。

テキストファイルの読み込みは1行ずつ行います。
下記がテキストファイルの読み込みの例です。

```python
with open(ファイルパス) as ファイル変数:
    処理
```

`with open`の構文で読み込みを行います。
`open`では`ファイルパス`を指定することでファイルの読み込みができます。

読み込んだ後の操作をするためにファイル変数として格納し処理を行う際に使います。

プログラムと同じ場所に置いたテキストファイルを読み込みする例です。

```python
with open('higedan_list.txt') as _r:
    for row in _r:
        print(row)
```
溶ける 絵の具 みたい イレギュラー 独り 何 ひとつ ...

for文を用いると1行ずつ文字列として処理が行えます。

上手くやれば、普通のテキストエディターでは開くことができない
長大なサイズのファイルの中も見ることができます。


### CSVファイル(.csv)

`CSV(Comma-Separated Values)`
`,`カンマで区切られた形式のファイル形式です。
縦、横で数が揃うような表形式のファイルになっています。

1行目は通常はヘッダー行として扱われ表頭としてのデータが書き込まれていることが多いです。
その場合、データ行は2行目以降になります。

注意点として`,`カンマをデータに含む場合は`"`で囲まれている場合があります。
`,`は通常、区切りの文字として扱われるため、データとしての`,`は
囲み文字で囲んでおかないとデータの列数などがずれてしまうことになります。

データを書き込む際や、読み込みをする際には気をつけましょう。

Python言語では`csv`ライブラリでCSVファイルの読み込みができます。
通常は`,`区切りですが、区切り文字を引数`delimiter`で指定ができます。
`TAB`区切りのファイルなども読み込みすることができます。

```python
import csv

with open(csvファイル名) as ファイル変数:
    csv変数 = csv.reader(ファイル変数)
    処理

with open(csvファイル名) as ファイル変数:
    csv変数 = csv.reader(ファイル変数 , delimiter='区切り文字')
    処理
```

データフレームとして読み込みをしたい場合は`pandas`ライブラリを用います。

```python
import pandas as pd

データフレーム変数名 = pd.read_csv(ファイルパス)
```

読み込んでみると次のようになります。

```python
import pandas as pd

df = pd.read_csv('tabelog_star_data.csv')
df.head()
```

|  | 夜価格低 | 昼価格低 | 星 | コメント数 | ブックマーク数 |
|--:|--:|--:|--:|--:|--:|
| 0 | 5000 | 1000 | 3.15 | 63 | 4763 |
| 1 | 2000 | 1000 | 3.37 | 15 | 1202 |
| 2 | 10000 | 3000 | 3.64 | 85 | 3340 |
| 3 | 3000 | 999 | 3.29 | 51 | 2568 |
| 4 | 5000 | 999 | 3.36 | 21 | 1522 |


### JSONファイル(.json)

`json`は辞書形式の文字列で書かれたファイルです。
テキストファイルとして読み込みすることもできますが、単純な文字列ではなく
辞書形式で読み込みするのであれば`json`ファイルとして読み込みをする必要があります。

```python
import json

with open(jsonファイル名) as ファイル変数:
    変数 = json.load(ファイル変数)
```

読み込みするとこうなります。

```python
import json

with open('json.json') as _r:
    js = json.load(_r)
print(js)
```
{'1': [1, 2, 3], '2': [3, 5, 6]}

#### ZIPファイル(.zip)

`ZIP`ファイルは圧縮形式のファイルで複数個のファイルを1つにまとめたファイルです。
そのため`ZIP`の中身のファイルが何かを知りたい場合は以下のようなコードになります。

```python
import zipfile

with zipfile.ZipFile(zipファイルパス) as zipファイル変数:
    for 変数 in zipファイル変数.namelist():
        print(変数.encode('文字コード'))
```

`ZIP`ではパスワード設定などもできるので展開方法は下記の通りです。

```python
import zipfile

#zipの全展開
with zipfile.ZipFile(zipファイルパス) as zipファイル変数:
    zipファイル変数.extractall(出力先ディレクトリ)

#zipのパスワード入力展開
with zipfile.ZipFile(zipファイルパス) as zipファイル変数:
    zipファイル変数.extractall(出力先ディレクトリ,pwd='パスワード')

#zipのファイル指定展開
with zipfile.ZipFile(zipファイルパス) as zipファイル変数:
    zipファイル変数.extract('ファイル名',出力先ディレクトリ)
```

#### GZIP(.gz)

`ZIP`と似ていますが1つのファイルを圧縮したファイル形式です。
そのため中身は1つしかありません。

ファイルを展開しながら中身を見るのは以下のようなコードです。

```python
import gzip

with gzip.open(GZIPファイルパス,'r') as gzipファイル変数:
    処理:
```

圧縮されているので、for文内で展開されるのは文字列ではなくバイトコードになったりするので気をつけましょう。

### 画像ファイル(.jpg , .png , .gif)

画像ファイルの読み込みは`PIL`ライブラリで行うことができます。


```python
from PIL import Image, ImageFilter, ImageOps

#画像を読み込みする
im = Image.open(ファイルパス)
 
#画像のサイズ
print(im.size) 
#画像のフォーマット
print(im.format) 
#画像のRGB最大最小値
print(im.getextrema()) 
#画像のメタ情報
print(im.mode)
```
(432, 288)
PNG
((0, 255), (0, 255), (0, 255), (255, 255))
RGBA

### エクセルファイル(.xlsx)

`エクセル`ファイルの読み込みは`pandas`ライブラリなどで行うことができます。
`pandas`ライブラリの場合はシートをそのままデータフレームとして読み込みします。

```python
import pandas as pd

データフレーム変数名 = pd.read_excel(ファイルパス, sheet_name='シート名')
```

読み込んでみると次のようになります。

```python
import pandas as pd

df = pd.read_excel('tabelog_star_data.xlsx',sheet_name='シート01')
df.head()
```

|  | 夜価格低 | 昼価格低 | 星 | コメント数 | ブックマーク数 |
|--:|--:|--:|--:|--:|--:|
| 0 | 5000 | 1000 | 3.15 | 63 | 4763 |
| 1 | 2000 | 1000 | 3.37 | 15 | 1202 |
| 2 | 10000 | 3000 | 3.64 | 85 | 3340 |
| 3 | 3000 | 999 | 3.29 | 51 | 2568 |
| 4 | 5000 | 999 | 3.36 | 21 | 1522 |

## ファイルの書き込み

テキスト形式のファイルであれば読み込みと同じような手順で書き込みができます。

```python
with open(ファイルパス,'w') as ファイル変数:
    処理
```

読み込みとの違いは`open`の引数に`'w'`が追加されることです。
`'w'`は上書き、`'a'`は追記で書き込みを行います。


画像の場合は`PIL`ライブラリなどで書き込みすることができます。

```python
from PIL import Image

Image変数.save(ファイルパス)
```

## まとめ

よく使うファイル形式のものだけですが、業務ではファイルの読み込み作業はかなり多いので
色々覚えておくと楽です。

他にも様々なデータ形式があり、都度読み込み方法が変わるので
自分が使うファイル形式のやり方を調べてみましょう。


君がエンジニアになるまであと31日

## 作者の情報
乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython