fs 파일시스템

fs 파일시스템

1 fs 팩키지 1 2

데이터 과학을 통해 데이터를 다루는 가장 많은 경우가 파일시스템에서 데이터를 끌어올려 작업하는 것을 들 수 있다. 이를 위해서 fs 팩키지가 개발되어 많은 기쁨을 개발자에게 주고 있다.

2 기본 문법

파일 시스템을 다루게 될 때 가장 기본이 되는 path_, file_, dir_, link_에 대해서 살펴보자.

  • path_: 경로(path)를 생성하고 다룸.
  • file_: 파일에 대한 작업에 사용
  • dir_: 디렉토리 작업에 사용
  • link_: 링크 작업에 사용.

2.1 파일 처리할 때: file_

파일 시스템의 기본이 되는 파일, 디렉토리, 링크 등을 CRUD할 때 다음 동사를 사용한다.

  • file_copy(), dir_copy(), link_copy(): 파일, 디렉토리, 링크 복사(copy)할 때 사용
  • file_create(), dir_create(), link_create(): 파일, 디렉토리, 링크 생성(create)할 때 사용
  • file_delete(), dir_delete(), link_delete(): 파일, 디렉토리, 링크 삭제(delete)할 때 사용
  • file_access(), file_exists(), dir_exists(), link_exists(): 접근 권한이 파일에 있는지와 파일, 디렉토리, 링크 존재(exist)하는지 확인할 때 사용
  • file_chmod(): 파일 권한 변경
  • file_chown(): 파일 소유권 혹은 그룹 소유 변경시 사용
  • file_info(): 파일에 붙은 메타정보(metadata) 추출시 사용
  • file_move(): 파일명 변경 혹은 이동에 사용.

2.2 경로 처리할 때: path_

파일 시스템을 구성하는 또다른 중요한 요소인 경로(path)를 다양한 방법으로 활용할 때 사용되는 동사는 다음과 같다.

  • path(), path_wd(): 파일 혹은 디렉토리에 경로 생성시킬 때 사용
  • file_temp(), path_temp(): 임시 파일에 대한 명칭을 생성시킬 때 사용
  • path_expand(), path_expand_r(), path_home(), path_home_r(): 사용자 홈(Home) 디렉토리 검색 시 사용.
  • path_file(), path_dir(), path_ext(), path_ext_remove(), path_ext_set(): 파일경로 처리할 때 사용
  • path_filter(): 경로명 필터링할 때 사용
  • path_real(), path_split(), path_join(), path_abs(), path_norm(), path_rel(), path_common(), path_has_parent(): 경로명에 대한 연산작업할 때 사용.

2.3 기타: is_

is_를 통해서 파일, 디렉토리, 링크인지를 확인할 수 있다.

  • is_file(): 파일인지 확인
  • is_dir(): 디렉토리인지 확인
  • is_link(): 링크인지 확인

3 기본 사용법

dir_info() 함수를 통해서 특정 파일크기(1MB) 이상인 파일을 내림차순으로 뽑아내고 필요한 정보만 추출한다.

# A tibble: 23 x 4
   path                          permissions       size modification_time  
   <fs::path>                    <fs::perms> <fs::byte> <dttm>             
 1 dynamic-webpage-selenium.html rw-              6.85M 2019-04-30 17:48:23
 2 static-webpage-table-2018.ht~ rw-              4.25M 2019-04-30 17:48:24
 3 static-webpage-table.html     rw-              4.19M 2019-04-30 17:48:24
 4 naver-people-info.html        rw-               3.3M 2019-04-30 17:48:24
 5 daum-related-search.html      rw-              2.81M 2019-04-30 17:48:22
 6 google-suggest.html           rw-              2.53M 2019-04-30 17:48:23
 7 fig/imac_rselenium.gif        rw-              2.27M 2019-04-30 17:48:23
 8 ingest-ocr-ppt.html           rw-              2.22M 2019-11-15 14:08:16
 9 fig/RSelenium_with_firefox.g~ rw-              2.16M 2019-04-30 17:48:23
10 cctv-sokcho.html              rw-              1.82M 2019-08-07 18:38:46
# ... with 13 more rows

현재 작업 프로젝트에 대해서 디렉토리별로 얼마마큼 파일이 있는지 파악하고자 할 때 다음과 같이 group_by를 사용해서 path_dir()로 추출된 디렉토리별로 합계를 구한다.

# A tibble: 40 x 2
   directory                                                           size
   <chr>                                                         <fs::byte>
 1 .                                                                 44.99M
 2 fig                                                                7.48M
 3 dynamic-webpage-imac_files/bootstrap-3.3.5/css                      2.2M
 4 data/weather                                                       1.65M
 5 dynamic-webpage-imac_files/trelliscopejs_widget-0.1.20              1.3M
 6 dynamic-webpage-imac_files/trelliscopejs_widget-binding-0.1.~       1.3M
 7 dynamic-webpage-imac_files/trelliscopejs_widget-binding-0.1.~       1.3M
 8 dynamic-webpage-imac_files/bootstrap-3.3.5/css/fonts             953.23K
 9 dynamic-webpage-imac_files/jqueryui-1.11.4                       741.98K
10 css/bootstrap                                                    581.76K
# ... with 30 more rows

4 파일 다수를 읽어들이기

4.1 파일 쪼개기

먼저 iris 파일을 각 꽃종류별로 쪼갠다. 확인한 결과를 dir_ls() 함수에 경로명 data/glob = "*.csv" 인자를 함께 넘겨 확인한다.

data/setosa.csv              data/sokcho-cctv.csv         
data/versicolor.csv          data/virginica.csv           
data/yonsei_data_science.csv 

4.2 파일 합치기

붓꽃(iris) 3종 csv 파일을 불러 읽어오자.

  • data/setosa.csv
  • data/versicolor.csv
  • data/virginica.csv

먼저 data/ 디렉토리에 .csv 확장자를 갖는 파일이 많아서 붓꽃 3종 .csv 파일만 선택하고, 이를 map_df 함수를 사용하여 각 파일별로 앞에 3개만 가져와서 데이터프레임으로 만들어 낸다.