Python 初級入門　ファイル操作

- python初学者、触ったことない人が投稿しています
- 個人的にあまり馴染みのない書き方について記載しています
- 誤っている箇所等があればコメントでご指摘いただけると幸いです
- こちらの記事は[オブジェクトとクラス編](https://qiita.com/takemaru_shuna/items/9e7ceb610aa68b389d13)の続きとなっていますので気になる方は是非！

では本編へ

## ファイル操作
- 基本操作
    - `print`関数でも使うことが可能
    - `close`は最後使うようにする
        - with ステートメントを使うようにする
```.py
text = """\
aaa
bbb
ccc
ddd
"""
# ファイルを選択
f = open('test.txt', 'w')　
f.write(test)
print('i am tester', file=f)
f.close()

# with ステートメントを使った内容
with open('test.txt', 'w') as f:
    f.write(test)

# ファイルの読み込み
# 全体の読み込み
with open('test.txt', 'r') as f:
    print(f.read())

# 一行読み込み
with open('test.txt', 'r') as f:
    while True:
        line = f.readline()
        # デフォルトでendに\nが入るので''に変更
        print(line,end='')
        if not line:
            break
# chunkで指定した文字数で読み込み
with open('test.txt', 'r') as f:
    while True:
        chunk= 2
        line = f.read(2)
        # 2文字ずつ読み込む
        print(line)
        if not line:
            break

# seekを使って飛ばす
with open('test.txt', 'r') as f:
    print(f.read(1))
    f.seek(5)
    # 五文字飛ばした後の文字を出力
    print(f.read(1))

# 書き込みと読み込みを同時に
with open('test.txt', 'w+') as f:
    f.write(text)
    f.seek(0) # 書き込み後に先頭に戻す
    print(f.read())
```
#### 組み込み関数open
| 文字  | 意味  |
|----------|----------|
| `r`    | 読み込み用に開く (デフォルト)    |
| `w`    | 書き込み用に開き、まずファイルを切り詰める    |
| `x`    | 排他的な生成に開き、ファイルが存在する場合は失敗する|
| `a`    | 書き込み用に開き、ファイルが存在する場合には末尾に追記する|
| `b`    | バイナリモード|
| `t`    | テキストモード|
| `+`    | 更新用に開く (読み込み・書き込み用)|


### テンプレート
- `string.Template`は読み込み専用で使用する
```.py
import string

template = """\
Hi $name.
$context
Have a good day
"""

t=string.Template(template)
contents = t.substitute(name='taro',context='hello how are you')
print(contents)
```

### CSVファイルにおける書き込みと読み込み
```.py
import csv

# csvへの書き込み
with open('test.csv','w')as csvf:
    fieldnames = ['Name','Count']
    writer = csv.DictWriter(csvf,fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'Name':'taro','Count':2})
    writer.writerow({'Name': 'hanako', 'Count': 1})

# csvの読み込み
with open('test.csv','r')as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        print(row['Name'],row['Count'])
```

### ファイル操作：ライブラリ
- os
    - [公式](https://docs.python.org/ja/3/library/os.html)を参照
- pathlib
    - [公式](https://docs.python.org/ja/3/library/pathlib.html)を参照
- shuntil
    - [公式](https://docs.python.org/ja/3/library/shutil.html)を参照
- glob
    - [公式](https://docs.python.org/ja/3/library/glob.html)を参照

- ファイル圧縮
    - [tarfile](https://docs.python.org/ja/3/library/tarfile.html)
    ```.py
    import tarfile

    with tarfile.open('test.tar.gz','w:gz') as tar:
        tar.add('test_dir')
    
    with tarfile.open('test.tar.gz','r:gz') as tar:
    
        # 展開
        tar.extractall(path='test_tar')
        with tar.extractfile('{filename}') as file:
            print(file.read())
    ```

- zipファイル
    - zip
    ```.py
    import zipfile

    with zipfile.ZipFile('test.zip','w') as zip:
        zip.write('test_dir')
        zip.write('test_dir/test.txt')

    with zipfile.ZipFile('test.zip','r') as zip:
        zip.extractall('hoge')

        # 1ファイルのみ確認
        with zip.open('hoge/hoge.txt') as file:
            print(file.read())
    ```
- tempfile
    - バッファの中で作成されるため、終わったあとは削除される
    - fileに出力したり、ディレクトリに吐き出すことも可能性
    ```.py
    import tempfile
    
    with tempfile.TemporaryFile(mode='w+') as temp:
        temp.write('test')
        temp.seek(0)
        print(temp.read())
    
    # fileに保存するやり方
    with tempfile.NamedTemporaryFile(delete=False) as temp:
        print(temp.name)
        with open(temp.name, 'w+') as file:
            file.write('testtest\n')
            file.seek(0)
            print(file.read())
    ```

    ## 最後に
    - ファイル操作は他の言語よりも使いやすいイメージ
    - sbuproocessにおいてはshellに投げることができるのは驚いたな
        - ただ、shellインジェクションに気をつけないといけないからあまり推奨されていない
    - 次回は簡単なアプリケーションを作ってみます