【R語言】文件及路勁操作

       大家可能對使用dos或者shell創建文件及文件夾或者查看和修改其屬性並不陌生,其實R語言的基礎函數中也囊括了文件夾和文件的基本操作函數,由於使用R的過程中會常常需要與文件打交道,因此一些基本的文件操作函數在實際使用中是十分常見的,這裏做了一些簡單的整理。

  • 構建文件路勁:
file.path(..., fsep = .Platform$file.sep)

file.path用於構建文件路勁,默認會使用.Platform$file.sep作爲文件分隔符,因此可以實現跨平臺操作,該函數實際較爲常用。

#按向量中元素對應的位置生成文件路勁
file.path(c('C:', 'D:'), c('R_script', 'R_data'))
  • 列出路勁下的文件/目錄 :
#列出當前目錄下的文件和文件夾
list.files(path = ".", pattern = NULL, all.files = FALSE,
full.names = FALSE, recursive = FALSE, ignore.case = FALSE,include.dirs = FALSE, no.. = FALSE)
#列出當前目錄下的文件和文件夾
dir(path = ".", pattern = NULL, all.files = FALSE,
full.names = FALSE, recursive = FALSE, ignore.case = FALSE,include.dirs = FALSE, no.. = FALSE)
#列出當前目錄下的所有子目錄,默認recursive = TRUE
list.dirs(path = ".", full.names = TRUE, recursive = TRUE)

- path – 字符串表示的路勁全名,默認爲當前工作路勁;
- pattern – 查找的文件名,支持正則表達式;
- all.files – 邏輯值,FALSE(默認)僅僅返回可見的文件名,TRUE返回文件全名;
- full.names – 邏輯值,FALSE(默認)僅返回文件名,TRUE返回文件名包括路勁;
- recursive – 邏輯值,FALSE(默認)僅返回當前目錄下文件,TRUE遞歸的掃描所有目錄下的文件;
- ignore.case – 邏輯值,FALSE(默認)文件名大小寫敏感,TRUE忽略大小寫;
- include.dirs -邏輯值,FALSE(默認)不添加子目錄名,TRUE加入子目錄名稱;
- no.. – 邏輯值,FALSE(默認)不排除‘.’和‘..’,TRUE爲排除;

返回給定路勁下文件名或文件夾組成的字符向量,如果沒有返回空字符。如果給定的路勁不存在,或爲非法路勁或沒有讀取權限,返回空字符。list.dirs隱式的包含all.files = TRUE。

#列出當前工作目錄下所有的文件和文件夾
list.files()
#列出當前工作目錄下所有的文件,包含子目錄文件
list.files(recursive = TRUE)

#列出當前工作目錄下所有.R結尾的文件
list.files(pattern = "*.R")
dir(pattern = "*.R")

#列出當前工作目錄下所有子目錄,默認的recursive = TRUE
list.dirs()

  • 創建文件夾及設置權限
path.expand(path)
dir.create(path, showWarnings = TRUE, recursive = FALSE, mode = "0777")
dir.exists(paths)
Sys.chmod(paths, mode = "0777", use_umask = TRUE)
Sys.umask(mode = NA)

- path – 字符串表示的路勁,路勁已經過path.expand處理
- paths – 字符向量包含文件名或路勁, 路勁已經過path.expand處理
- showWarnings – 邏輯值,是否提示錯誤信息;
- recursive – 邏輯值,是否創建子目錄
- mode – 八進制表示的權限,r=4,w=2,x=1 (windows環境下該參數無效)

- use_umask – 邏輯值,mode是否受umask 設置的限制;

#讀取環境變量R_USER,返回C:/Users/XXXX/Documents
Sys.getenv('R_USER')
#使用home path替換波浪號,返回C:/Users/XXXX/Documents/foo
path.expand("~/foo")

#在當前工作目錄下創建文件夾testfolder
dir.create(file.path(getwd(), 'testfolder'))
#默認的recursive爲FALSE,創建子目錄失敗
dir.create(file.path(getwd(), 'testfolder2', 'subfolder'))
#文件夾不存在返回FALSE
dir.exists(file.path(getwd(), 'testfolder2', 'subfolder'))
#設置recursive爲TRUE,創建子目錄
dir.create(file.path(getwd(), 'testfolder2', 'subfolder'), recursive = TRUE)
#創建成功返回TRUE
dir.exists(file.path(getwd(), 'testfolder2', 'subfolder'))

#設置文件目錄的最大權限
Sys.chmod(list.dirs("."), "777")

  • 查詢和設置R包使用路勁
.libPaths(new)

不帶參數時.libPaths()會顯示當前使用的R包路勁,設置參數可用於設置當前R包路徑,對於安裝多版本R語言的情況,可以通過使用.libPaths設置使用的R包路勁。

#設置R包路勁爲R-3.2.2下的library
.libPaths("C:/Users/XXXX/Documents/R/R-3.2.2/library")
  • 文件處理
file.create(..., showWarnings = TRUE)
file.exists(...)
#成功返回0,失敗返回-1
file.access(names, mode = 0)
file.remove(...)
#刪除文件及目錄
unlink(x, recursive = FALSE, force = FALSE) 
file.rename(from, to)
file.append(file1, file2)
file.copy(from, to, overwrite = recursive, recursive = FALSE, copy.mode = TRUE, copy.date = FALSE)
file.show(..., header = rep("", nfiles),title = "R Information", delete.file = FALSE, pager = getOption("pager"), encoding = "")
file.symlink(from, to)
file.link(from, to)
Sys.junction(from, to)

- from, to - 字符串向量表示的文件或路徑
- overwrite - 邏輯值,是否覆蓋已存在的文件
- showWarnings – 邏輯值,出錯是否顯示warning信息
- recursive – 邏輯值,是否複製子目錄文件
- copy.mode - 邏輯值,是否同時複製文件權限
- copy.date – 邏輯值,是否保留文件日期
- mode – 接入模式,0,是否存在;1,是否可執行(windows沒有可執行概念, 後綴爲.exe, .bat, .cmd或.com的文件會被視爲可執行文件);2,是否可寫;4,是否可讀;

#文件不存在則創建文件,存在則覆蓋之前的文件
file.create('cretestfile.txt')
#判斷文件是否存在,返回TRUE
file.exists('cretestfile.txt')
#默認mode = 0判斷文件是否存在,存在返回0
file.access('cretestfile.txt')
#刪除文件cretestfile.txt,文件不存在會返回warning信息
file.remove('cretestfile.txt')

#讀取bin目錄下所有文件及目錄
d <- dir(file.path(R.home(), "bin"))
#讀取bin目錄下所有文件及目錄(包含全路徑)
df <- dir(file.path(R.home(), "bin"), full.names = TRUE)
#列出所有存在的文件
d[file.access(df, 0) == 0]
#列出所有可執行文件
d[file.access(df, 1) == 0]
#列出所有可寫文件
d[file.access(df, 2) == 0]
#列出所有可讀文件
d[file.access(df, 4) == 0]

#創建並寫入數據到文件A.txt和B.txt
cat("file A\n", file = "A.txt")
cat("file B\n", file = "B.txt")
cat("file C\n", file = "C.txt")
#添加文件C.txt的內容到A.txt和B.txt
file.append(c("A.txt", "B.txt"), "C.txt")
#修改文件名C.txt爲D.txt
file.rename("C.txt", "D.txt")
#複製D.txt中的內容10遍,添加到文件A.txt和B.txt各5次
file.append(c("A.txt", "B.txt"), rep("D.txt", 10))
#讀取文件A.txt和B.txt的內容
file.show(c("A.txt", "B.txt"))
#複製文件D.txt到C.txt
file.copy("D.txt", "C.txt")
#C.txt已存在,設置overwrite = TRUE進行覆蓋
file.copy("D.txt", "C.txt", overwrite = TRUE)
#新建tmp文件夾,並拷貝A.txt和B.txt到tmp文件夾下
dir.create("tmp")
file.copy(c("A.txt", "B.txt"), "tmp")
#刪除tmp文件夾
unlink("tmp", recursive = TRUE)
#刪除文件
unlink(c("A.txt", "B.txt", "C.txt","D.txt"))

  • 文件信息查詢
file.info(..., extra_cols = TRUE)
file.mode(...)
file.mtime(...)
file.size(...)

file.info返回文件相關信息:

- size – doule類型,表示文件大小Bytes
- isdir – 邏輯值,表示是否文件夾或者文件
- mode – 8進製表示的權限,r=4,w=2,x=1 
- mtime – 最近一次修改的時間
- ctime – 最近一個狀態改變的時間,例如在寫入文件、更改所有者、權限、屬性或鏈接設置,mtime的改變必然導致ctime的改變
- atime -讀取文件或者執行文件時更改

- exe – 可執行類型,返回值包含no,msdos, win16, win32, win64 和unknown

#返回當前目錄下所有文件及目錄的信息
file.info(list.files())
#返回當前目錄下所有文件的mode
file.mode(list.files())
file.info(list.files())$mode
#返回當前目錄下所有文件的最近一次修改時間
file.mtime(list.files())
file.info(list.files())$mtime
#返回當前目錄下所有文件的大小,目錄size返回爲0
file.size(list.files(()))
file.info(list.files())$size







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章