ファイルの読み書き

##ファイルの読み書き
###osモジュール
####各OSに対応したパスを文字列として返す

```python.py
import os
os.path.join('usr', 'bin', 'spam')
```

```result.
'usr\\bin\\spam'
```
※今回はWindows環境であり、文字列の中では\をエスケープする必要があるためこのような出力結果になっている

```python.py
my_files = ['accounts.txt', 'datalist.csv', 'invite.docx']
for filename in my_files:
    print(os.path.join('C:\\Users\\aswegart', filename))
```

```result.
C:\Users\aswegart\accounts.txt
C:\Users\aswegart\datalist.csv
C:\Users\aswegart\invite.docx
```

#####カレントディレクトリのパスを取得する

```python.py
os.getcwd()
```

```result.
'C:\\Users\\j-fuk\\code\\jupyter notebook'
```

####カレントディレクトリを変更する

```python.py
os.chdir('C:\\Windows\\System32')
os.getcwd()
```

```result.
'C:\\Windows\\System32'
```

####新しいフォルダを作成する

```python.py
os.makedirs('C:\\delicious\\walnut\\waffles')
```
**os.makedirs()は、フルパスで指定したフォルダに必要な中間フォルダも作成してくれる**

####絶対パスを調べる

```python.py
os.path.abspath('jupyter notebook')
```

```result.
os.path.abspath('.')
```

####引数が絶対パスか否かを判断

```python.py
print(os.path.isabs('.'))
print(os.path.isabs(os.path.abspath('.')))
```

```result.
False
True
```

####第2引数から第1引数への相対パスを返す
第1引数：対象
第2引数：スタート位置

```python.py
os.path.relpath('C:\\delicious', 'C:\\Users')
```

```result.
'..\\delicious'
```

####dirnameとbasenameを取得する

```python.py
path = 'C:\\Windows\\System32\\calc.exe'
print(os.path.basename(path))     # 引数（パス）の最後のパス区切り記号までの文字列を返す
print(os.path.dirname(path))      # 最後のパス区切り記号より後ろを返す
print(os.path.split(path))        # dirnameとbasenameをタプルとして取得する
```

```result.
calc.exe
C:\Windows\System32
('C:\\Windows\\System32', 'calc.exe')
```

####パスを個々の要素に分解する
※OSに依存しない

```python.py
path = 'C:\\Windows\\System32\\calc.exe'
print(path.split(os.sep))  
```

```result.
['C:', 'Windows', 'System32', 'calc.exe']
```
**※os.sepには、プログラムを実行しているOSにおけるパス区切り文字が格納されている**

####ファイルのサイズをバイト単位で返す

```python.py
os.path.getsize('C:\\Windows\\System32\\calc.exe')
```

```result.
26112
```

####フォルダ内のファイルとフォルダ名をリスト表示

```python.py
os.listdir('.')
```

```result.
['.ipynb_checkpoints',
 'Untitled.ipynb',
 'ファイルとファイルパス.ipynb',
 '文字列操作.ipynb',
 '正規表現によるパターンマッチング.ipynb']
```

####ディレクトリ内のファイルの合計サイズを求める**

```python.py
total_size = 0
for filename in os.listdir('C:\\Windows\\System32'):
    total_size += os.path.getsize(os.path.join('C:\\Windows\\System32', filename))
print(total_size)
```

```result.
976532599
```

####指定したファイルやディレクトリの存在有無

```python.py
print(os.path.exists('C:\\Windows'))
print(os.path.exists('C:\\some_made_up_folder'))
```

```result.
True
False
```

####ファイルかディレクトリかを確認する

```python.py
print(os.path.isdir('C:\\Windows\\System32'))
print(os.path.isfile('C:\\Windows\\System32'))
print(os.path.isdir('C:\\Windows\\System32\\calc.exe'))
print(os.path.isfile('C:\\Windows\\System32\\calc.exe'))
```

```result.
True
False
False
True
```

####DVDやフラッシュメモリーの接続確認**

```python.py
os.path.exists('D:\\')
```

```result.
False
```

####ファイルを読み書きする3つのステップ

#####1. open()関数でFileオブジェクトを取得する

```python.py
fruits_file = open('C:\\demo\\fruits.txt')  # デフォルトで読み込みモードで開いている
# 読み込みモードを明示する場合は第2引数に'r'を渡す
# fruits_file = open('C:\\demo\\fruits.txt', 'r')

```
**※open()の戻り値はFileオブジェクト**

#####2. ファイル内容を読み込む

```fruits.txt
apple
banana
meron
```

**read()メソッド：ファイル全体を一つの文字列の値として読み込む**

```python.py
fruits_content1 = fruits_file.read()
fruits_content1
```

```result.
'apple\nbanana\nmeron'
```

**readlines()メソッド：1行ずつの文字列のリストとして読み込む**

```python.py
# 行ごとに分かれた文字列のリストとして扱うほうが処理しやすいことが多い
fruits_content2 = fruits_file.readlines()
fruits_content2
```

```result.
['apple\n', 'banana\n', 'meron']
```

#####3. ファイルを書き込む
ファイルに書き込むには**「書き込みモード, 'w'」**または**「追記モード, 'a'」**でファイルを開く必要がある。

※指定したファイルが存在しない場合は新規作成される
※書き込みモードや追記モードのときにファイルを閉じ忘れたままプログラムが異常終了すると、ファイル内容が壊れることあり

```python.py
fruits_file = open('C:\\demo\\fruits.txt', 'w')
fruits_file.write('lemon\n')
```

```result.
6  # 書き込まれた文字数（改行含む）
```

```python.py
fruits_file = open('C:\\demo\\fruits.txt', 'a')
fruits_file.write('orange\n')
fruits_file.close()
fruits_file = open('C:\\demo\\fruits.txt')
fruits_content = fruits_file.read()
print(fruits_content)
```

```result.
lemon
orange
```