파이썬3 노트

pathlib 이야기: [Path.open()] [Path.home()] [exists()] [mkdir()]

Jonchann 2018. 12. 15. 18:59

파이썬으로 파일을 불러오는데 있어서 pathlib은 중요하다.

나는 항상

from pathlib import Path

dir_folder = Path('file path')
file1 = dir_folder / 'file name'
file2 = dir_folder / 'folder name' / 'file name'

def load(file: Path):
    with open(file, mode='r') as f:
     ....

혹은

import pathlib

dir_folder = pathlib.Path(__file__).parent()
file1 = dir_folder / 'file name'

def load(file: pathlib):
    with open(file, mode='r') as f:
     ...

와 같이 pathlib을 사용했었다.


하지만 얼마 전에 선배의 코드를 보고 이런 식으로 사용할 수 있구나 라는 것을 알았기 때문에 여기에 필기하려 한다.




1. pathlib.Path.open()


아까 적었던 yield 글에 올렸던 코드를 가져와 보겠다.

def iter_(file: Path):
    with open(file, mode='r', encoding='utf-8') as f:
        yield from csv.reader(f)

datum = iter_('filename')

여기서도 나는 with open(file, ... 로 코드를 시작했는데 사실

from pathlib import Path
from torchtext.data import Dataset
import csv


dir_folder = Path.home() / 'data'

if not dir_folder.exists():
    dir_folder.mkdir(parents=True)


def iter_(path):
    with path.open('r', encoding='utf-8') as fp:
        yield from csv.reader(fp)


class DataLoadwithPath(Dataset):
    urls = [
        'url1'
        'url2'
    ]


    def __init__(self, fst_path, scd_path):
        datum = []
        for (i, j) in zip(iter_(fst_data_path), iter_(scd_data_path)):
            datum.append((i, j))
        super(DataLoadwithPath, self).__init__(datum)


    @classmethod
    def load(cls, path=None, root=dir_folder / 'dataset folder name'):
        if path is None:
            new_path = cls.download(root)
        fst_data_path = Path(new_path) / 'file name'
        scd_data_path = Path(new_path) / 'file name'
        return fst_data_path, scd_data_path


if __name__ == '__main__':

처럼 file 대신 path를 인수로 넘겨줄 수 있다.


위 코드에 보면 뭐가 되게 등장하는데 하나씩 살펴보겠다.



2. pathlib.Path.home(), exists()


위 코드에 보면

dir_folder = Path.home() / 'data'

라고 되어있는데 파이썬3+에서 출력해보면 알겠지만 본인 계정 경로 즉 /Users/'account name' 이라는 것을 알 수 있다.

이처럼 어느 컴퓨터를 사용하더라도 Path.home() / 'data' 를 적어주면 무조건 같은 위치로 인식한다는 것이다.


만약 계정 폴더 안에 data라는 폴더가 없을 경우엔

if not dir_folder.exists():
    dir_folder.mkdir(parents=True)

라고 적어줌으로써 data폴더를 만들어주고 그 안에 데이터를 생성하든 다운받든 할 수 있게 된다.



3. mkdir(parents=True)


마지막으로 볼 것은 방금 말한 data 폴더를 만들 때의 얘기인데, 이 때 mkdir()라는 함수가 나온다.

이건 command line으로 많이 사용하기 때문에 잘 알겠지만 폴더를 만들어 주기 위한 함수이다.

안에 parent=True 라고 되어있는 것은 상위폴더도 같이 생성하겠느냐를 묻는 것이고 True라고 했기 때문에 같이 생성된다.

(하지만 이걸로 새로 폴더를 생성해 봤으나 parent가 어디에 같이 생성되었다는 것인지 아직 잘 모르겠다. 그냥 홈 디렉토리에 내가 임의로 적은 이름의 폴더가 생성되었을 뿐이다)