fs
로컬파일fs
팩키지 1 2데이터 과학을 통해 데이터를 다루는 가장 많은 경우가 파일시스템에서 데이터를 끌어올려 작업하는 것을 들 수 있다. 이를 위해서 fs
팩키지가 개발되어 많은 기쁨을 개발자에게 주고 있다.
fs
팩키지 설치설치과정은 단순하다.
파일 시스템을 다루게 될 때 가장 기본이 되는 path_
, file_
, dir_
, link_
에 대해서 살펴보자.
path_
: 경로(path)를 생성하고 다룸.file_
: 파일에 대한 작업에 사용dir_
: 디렉토리 작업에 사용link_
: 링크 작업에 사용.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()
: 파일명 변경 혹은 이동에 사용.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()
: 경로명에 대한 연산작업할 때 사용.is_
is_
를 통해서 파일, 디렉토리, 링크인지를 확인할 수 있다.
is_file()
: 파일인지 확인is_dir()
: 디렉토리인지 확인is_link()
: 링크인지 확인dir_info()
함수를 통해서 특정 파일크기(1MB) 이상인 파일을 내림차순으로 뽑아내고 필요한 정보만 추출한다.
library(tidyverse)
library(fs)
dir_info(path = '.', recurse = TRUE) %>%
filter(type =="file", size > "1MB") %>%
arrange(desc(size)) %>%
select(path, permissions, size, modification_time)
# 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()
로 추출된 디렉토리별로 합계를 구한다.
dir_info(path = ".", recursive = TRUE) %>%
group_by(directory = path_dir(path)) %>%
summarise(size = sum(size)) %>%
arrange(desc(size))
# 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
먼저 iris
파일을 각 꽃종류별로 쪼갠다. 확인한 결과를 dir_ls()
함수에 경로명 data/
과 glob = "*.csv"
인자를 함께 넘겨 확인한다.
# Create separate files for each species
iris %>%
split(.$Species) %>%
map(select, -Species) %>%
iwalk(~ write_csv(.x, paste0("data/", .y, ".csv")))
dir_ls("data/", glob = "*.csv")
data/setosa.csv data/sokcho-cctv.csv
data/versicolor.csv data/virginica.csv
data/yonsei_data_science.csv
붓꽃(iris) 3종 csv 파일을 불러 읽어오자.
data/setosa.csv
data/versicolor.csv
data/virginica.csv
먼저 data/
디렉토리에 .csv
확장자를 갖는 파일이 많아서 붓꽃 3종 .csv
파일만 선택하고, 이를 map_df
함수를 사용하여 각 파일별로 앞에 3개만 가져와서 데이터프레임으로 만들어 낸다.