Python はじめから勉強 Hour9ファイルの読み書き

# Python はじめから勉強 Hour9：ファイルの読み書き

* Pythonで何かしようとしたときに、まずサンプルスクリプトを探してなんとなく実行してた私が、
* 自動実行でREST API叩いて、結果の確認、VM操作までやってみたいと思う7時間
* と思ってたら7時間を超えて10回になりそうです。
* 今回はファイルの読み書き。CSVやJSONファイルを扱えるようになりそうです

## 学習資料

* たった 1日で基本が身に付く！ Python超入門 
  * https://a.r10.to/hbHMiv



## 過去の投稿

* [Python はじめから勉強 Hour1：Hello World](https://qiita.com/matsumo2019/items/5a69381f44456e6e6a5d)
* [Python はじめから勉強 Hour2：制御文](https://qiita.com/matsumo2019/items/6daa862fd34c8929fb65)
* [Python はじめから勉強 Hour3：関数](https://qiita.com/matsumo2019/items/6c63c737c27e51000f79)
* [Python はじめから勉強 Hour4：オブジェクト指向①](https://qiita.com/matsumo2019/items/b4e083b804590fcdf0d1)
* [Python はじめから勉強 Hour5：オブジェクト指向②](https://qiita.com/matsumo2019/items/5d429147ae44d81a69da)
* [Python はじめから勉強 Hour6：よく使うデータ型：タプル型・セット型・辞書型](https://qiita.com/matsumo2019/items/378009f0d65521c083df)
* [Python はじめから勉強 Hour7：クラスの使い方](https://qiita.com/matsumo2019/items/366bfd7e1dfbc06c89ab)
* [Python はじめから勉強 Hour8：パッケージの利用](https://qiita.com/matsumo2019/items/c820eab730f4bcad9b8f)
* Python はじめから勉強 Hour9：ファイルの読み書き
* Python はじめから勉強 Hour10：アプリケーションの作成



## 環境

* Windows
* Python Ver3系



## ファイルの読み書きはテキストエディタと同じ！これ大事

* これはどんなプログラミング言語でも同じですが、ファイルの読み書きは下記の流れです

  1. ファイルを開く
  2. 読み書きする
  3. ファイルを閉じる

* これだけ！！

* Python的には

  1. open関数で開く、開く時のモード（読み(r)、追記(a)、上書き(w)）を指定
  2. readメソッドなどを使って読み書きする
  3. closeメソッドで閉じる

* 簡単そうです。

  

## テキストファイルを読み込む

* テキストファイルを読み込みます
* 普段パソコンでテキストエディタを使う時は、「開く」メニューでファイルを開くとファイルの内容が画面に表示されますが、Pythonではopen関数で開きます。
* open関数で開いたときに「ファイルオブジェクト」が得られます。

### ファイルを開いてみる

* インタラクティブモードでの処理をひとまず見てください

```python
C:\script>python
Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> fin = open('aaa.txt', 'r')# open関数でaaa.txtを読み込みモードで開きます。finがファイルオブジェクト
>>> print(fin)
<_io.TextIOWrapper name='aaa.txt' mode='r' encoding='cp932'>
>>>
>>> # オブジェクトをprintすると読み込んだファイル名とモード(r)が表示されます。※中身は表示されません

```

* finというファイルオブジェクトに対して読み込みなどを行っていきます。



### ファイルの内容を読み込んでみる

* 上記の続きです

```python
C:\script>python
Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> fin = open('aaa.txt', 'r')
>>> print(fin)
<_io.TextIOWrapper name='aaa.txt' mode='r' encoding='cp932'>
>>>
>>> text = fin.read()    # readメソッドでファイルの中身を全部読み込みます
>>> print(text)
aaa
bbb
ccc
>>>
```



### 終わったら閉じる

* 上記の続きです

```python
C:\script>python
Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> fin = open('aaa.txt', 'r')
>>> print(fin)
<_io.TextIOWrapper name='aaa.txt' mode='r' encoding='cp932'>
>>>
>>> text = fin.read() 
>>> print(text)
aaa
bbb
ccc
>>>fin.close()  # 閉じないとOSのリソースを使ったままになります
>>>
```



## ファイルに追記する

* 同じようにファイルに追記してみます。

```python
>>> fadd = open('aaa.txt', 'a')		# 追記モードで開く
>>> fadd.write('write add text\n')	# テキストを追記する
>>> fadd.close()				   # ファイルを閉じる
>>>
>>>
>>>
>>> fin = open('aaa.txt', 'r')      # 最初と同じようにファイルの中身を見てみる
>>> text = fin.read()
>>> print(text)
aaa
bbb
ccc
write add text					  # 追記されたことが分かります

>>>
```



## ユーザの入力を利用する

* プログラムをコマンドラインで実行する際の引数や、プログラムの途中でユーザへ入力を促したり、その値を利用します。

### 引数による入力

```python
C:\script>test50_print_arg.py hogeo hoge2				# 引数を二つ渡すと
['C:\\script\\test50_print_arg.py', 'hogeo', 'hoge2']	 # プログラム中に使用できる

C:\script>
```

### 実行したスクリプトの中身

```python
import sys
print(sys.argv)		# 引数を出力するだけのプログラムです
```



## コマンドラインの引数でファイルを読み込む

* ファイル名など一般的に可変なものをコードに直接書くのは汎用性に欠けるので引数で渡せるようにしましょう



### 引数で指定したファイルを読み込むスクリプト

```python
import sys

fin = open(sys.arg[1], 'r')
print(fin.read())
fin.close()
```

### 実行結果

```python
C:\script>test51_print_argfiles.py aaa.txt
aaa.txt
aaa
bbb
cccwrite add text

```



* これだと引数に不正なものがあったら処理が止まってしまうので、引数で渡す前提のプログラムはエラー処理しましょう。
* 引数チェックの一般的な処理を入れてみます。

### 引数で指定したファイルを読み込むスクリプト（エラー処理あり）

```python
import sys

if len(sys.argv) < 2:						# エラー処理 引数は1個（未満）
    print ('Error!! Please input filename')
    exit()
    
FILE_NAME = sys.argv[1]

fin = open(FILE_NAME, 'r')
print(fin.read())
fin.close()
```

### 実行結果

```python
C:\script>test52_print_argfiles2ー.py
Error!! Please input filename			# Pythonの無機質なエラーよりいいですね。

C:\script>test52_print_argfiles2ー.py aaa.txt
aaa
bbb

C:\script>
```



## プログラムの途中で入力をうながす

* input関数を使うとプログラムが入力を促す状態になります
* input関数の戻り値を文字列として扱うことができます。

### ファイル名の入力させてファイルの中身を表示する(日本語はUTF-8で保存してください)

```python
print('Phtyon Start!!')
file_name = input('ファイル名を入力して下さい。input fine name = ')

fin = open(file_name, 'r')
print(fin.read())
fin.close()

```

### 

### 実行結果

```python
C:\script>test53_input.py
Phtyon Start!!
ファイル名を入力して下さい。input fine name = aaa.txt
aaa
bbb

C:\script>

```

### 

## 今回のまとめ

* 各言語でファイルのIOでいつも行き詰ってましたが、簡単に処理できました。プログラムも通常のテキストエディタと同じ！
* 書き込むことより読み込んで処理することが多いと思うのでここまでできればよいと思う。
* このあたりをさらっとやると、使いこなしの第一歩のような気がします



## 名言・ライトニングトーク用

* 引数やユーザ入力があるような、自由度が高いプログラムはエラー処理が必要ですね。難しい
*