python pathlibの使い方メモ

# 1. pathlibとは

ファイルやディレクトリを操作するpython標準パッケージです
https://docs.python.org/ja/3/library/pathlib.html

os.pathで出来ることは大抵できます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/48081c71-d3a5-78d4-aa2a-7171b32de62e.png" width=50%>


























# 2. os.pathよりも優れている点


### 2-1. 連続して操作するときに可読性が上がる


os.pathだと入れ子になって読みにくいですが、pathlibだと読みやすいです


```python:os.pathの場合
>>> path = '../hoge/fuga/hoo/sample.png'
>>> os.path.dirname(os.path.dirname(os.path.dirname(path)))
'../hoge'
```


```python:pathlibの場合
>>> p = Path('../hoge/fuga/hoo/')
>>> p.parent.parent.as_posix()
'../hoge'
```


### 2-2. 末尾の / の有無を意識しなくても良い


os.path.dirname(path)は '/'.join(path.split('/')[:-1]) をやってるだけなので末尾に'/'があるかないかで結果が変わりますが、pathlibはオブジェクト化するときに解釈して末尾の'/'を無視してくれるので意識する必要がなくなります


```python:os.pathの場合
>>> path = '../hoge/fuga/hoo/'
>>> os.path.dirname(os.path.dirname(os.path.dirname(path)))
'../hoge'

>>> path = '../hoge/fuga/hoo'
>>> os.path.dirname(os.path.dirname(os.path.dirname(path)))
'../'
```


```python:pathlibの場合
>>> p = Path('../hoge/fuga/hoo/')
>>> p.parent.parent.parent
'../'

>>> p = Path('../hoge/fuga/hoo') 
>>> p.parent.parent.parent 
'../'
```


### 2-3. 拡張子やファイル名の置き換えが簡単


```python:拡張子の置き換え
>>> file = Path('../code/hoge.py')
>>> file.with_suffix('.txt').as_posix()
'../code/hoge.txt'
```

```python:ファイル名の置き換え
>>> file = Path('../code/hoge.py')
>>> file.with_name('fuga.py').as_posix()
'../code/fuga.py'
```



### 2-4. ワイルドカード検索が出来る


拡張子やファイル名でファイルまたはフォルダを検索することが出来ます

```python
>>> list(p.rglob('*.py'))
[WindowsPath('../code/fuga.py'),
 WindowsPath('../code/hoba.py'),
 WindowsPath('../code/hoge.py'),
 WindowsPath('../code2/fugafuga.py'),
 WindowsPath('../code2/hogehoge.py')]
```


# 3. 使い方


#### pathの指定


```python:pathを指定する
>>> from pathlib import Path
>>> p = Path('..')
>>> p
WindowsPath('..')
```


#### ファイル一覧を取得する


```python:
>>> list(p.iterdir())
[WindowsPath('../code'),
 WindowsPath('../code2'),
 WindowsPath('../data'),
 WindowsPath('../input')]
```


#### pathを移動する


```python:フォルダに移動する
>>> q = p / 'code'
>>> q
WindowsPath('../code')
```


```python:親フォルダに移動する
>>> q = q.parent
>>> q
WindowsPath('..')
```


#### pathを文字列で取得する


```python:posix形式
>>> q = p / 'code'
>>> q.as_posix()
'../code'
```


```python:絶対path
>>> q.resolve()
WindowsPath('C:/Users/jjaka/google_drive/python/python練習/20210224_pathlib')
```


#### ファイル名、拡張子を取得する


```python:
>>> q = Path('../code/foo.tar.gz')
>>> q
WindowsPath('../code/foo.tar.gz')

>>> q.name
'foo.tar.gz'

>>> q.suffix
gz

>>> q.suffixes
['.tar', '.gz']
```


#### ファイル名、拡張子を置き換える


```python
>>> q = Path('../code/hoge.py')
>>> q.with_suffix('.txt')
WindowsPath('../code/hoge.txt')

>>> q.with_name('fuga.txt')
WindowsPath('../code/fuga.txt')
```


#### pathにファイル、ディレクトリがあるか確認する


```python:
>>> q = Path('../code/hoge.py')
>>> q.is_file()
True

>>> q = Path('../code')
>>> q.is_dir()
True

>>> q.is_reserved()
False
```


#### ワイルドカードで検索する


rglobはフォルダ以下をすべて検索してくれます

```python
>>> p = Path('..')
>>> list(p.rglob('*.py'))
[WindowsPath('../code/fuga.py'),
 WindowsPath('../code/hoba.py'),
 WindowsPath('../code/hoge.py'),
 WindowsPath('../code2/fugafuga.py'),
 WindowsPath('../code2/hogehoge.py')]

>>> q = q / 'code'
>>> list(q.rglob('*.py'))
[WindowsPath('../code/fuga.py'),
 WindowsPath('../code/hoba.py'),
 WindowsPath('../code/hoge.py')]
```