zoukankan      html  css  js  c++  java
  • R语言文件相关的操作

    1. 文件系统介绍

    R语言对文件系统的操作,包括文件操作和目录操作,函数API都定义在base包中。

    2. 目录操作

    2.1 查看目录

    查看当前目录下的子目录。

    
    # 启动R程序
    ~ R
    
    # 当前的目录
    > getwd()
    [1] "/home/conan/R/fs"
    
    # 查看当前目录的子目录
    > list.dirs()
    [1] "."     "./tmp"
    

    查看当前目录的子目录和文件。

    
    > dir()
    [1] "readme.txt" "tmp"
    
    # 查看指定目录的子目录和文件。
    > dir(path="/home/conan/R")
     [1] "A.txt"                             "caTools"
     [3] "chinaWeather"                      "DemoRJava"
     [5] "env"                               "FastRWeb"
     [7] "font"                              "fs"
     [9] "github"                            "lineprof"
    [11] "pryr"                              "readme.txt"
    [13] "RMySQL"                            "RServe"
    [15] "rstudio-server-0.97.551-amd64.deb" "websockets"
    [17] "x86_64-pc-linux-gnu-library"
    
    # 只列出以字母R开头的子目录或文件
    > dir(path="/home/conan/R",pattern='^R')
    [1] "RMySQL" "RServe"
    
    # 列出目录下所有的目录和文件,包括隐藏文件,如 .A.txt
    > dir(path="/home/conan/R",all.files=TRUE)
     [1] "."                                 ".."
     [3] ".A.txt"                            "A.txt"
     [5] "caTools"                           "chinaWeather"
     [7] "DemoRJava"                         "env"
     [9] "FastRWeb"                          "font"
    [11] "fs"                                "github"
    [13] "lineprof"                          "pryr"
    [15] "readme.txt"                        "RMySQL"
    [17] "RServe"                            "rstudio-server-0.97.551-amd64.deb"
    [19] "websockets"                        "x86_64-pc-linux-gnu-library"
    

    查看当前目录的子目录和文件,同dir()函数。

    
    > list.files()
    [1] "readme.txt" "tmp"
    
    > list.files(".",all.files=TRUE)
    [1] "."          ".."         "readme.txt" "tmp"
    

    查看完整的目录信息。

    
    # 查看当前目录权限
    > file.info(".")
      size isdir mode               mtime               ctime               atime  uid  gid uname grname
    . 4096  TRUE  775 2013-11-14 08:40:46 2013-11-14 08:40:46 2013-11-14 08:41:57 1000 1000 conan  conan
    
    # 查看指定目录权限
    > file.info("./tmp")
          size isdir mode               mtime               ctime               atime  uid  gid uname grname
    ./tmp 4096  TRUE  775 2013-11-14 14:35:56 2013-11-14 14:35:56 2013-11-14 14:35:56 1000 1000 conan  conan
    

    2.2 创建目录

    
    # 在当前目录下,新建一个目录
    > dir.create("create")
    > list.dirs()
    [1] "."        "./create" "./tmp"
    

    创建一个3级子目录./a1/b2/c3

    
    # 直接创建,出错
    > dir.create(path="a1/b2/c3")
    Warning message:
    In dir.create(path = "a1/b2/c3") :
      cannot create dir 'a1/b2/c3', reason 'No such file or directory'
    
    # 递归创建,成功
    > dir.create(path="a1/b2/c3",recursive = TRUE)
    > list.dirs()
    [1] "."          "./a1"       "./a1/b2"    "./a1/b2/c3" "./create"  "./tmp"
    
    # 通过系统命令查看目录结构
    > system("tree")
    .
    ├── a1
    │   └── b2
    │       └── c3
    ├── create
    ├── readme.txt
    └── tmp
    

    2.3 检查目录是否存在

    
    # 目录存在
    > file.exists(".")
    [1] TRUE
    > file.exists("./a1/b2")
    [1] TRUE
    
    # 目录不存在
    > file.exists("./aa")
    [1] FALSE
    

    2.4 检查目录的权限

    检查目录的权限

    
    > df<-dir(full.names = TRUE)
    
    # 检查文件或目录是否存在,mode=0
    > file.access(df, 0) == 0
    ./a1     ./create ./readme.txt        ./tmp
    TRUE         TRUE         TRUE         TRUE
    
    # 检查文件或目录是否可执行,mode=1,目录为可以执行
    > file.access(df, 1) == 0
    ./a1     ./create ./readme.txt        ./tmp
    TRUE         TRUE        FALSE         TRUE
    
    # 检查文件或目录是否可写,mode=2
    > file.access(df, 2) == 0
    ./a1     ./create ./readme.txt        ./tmp
    TRUE         TRUE         TRUE         TRUE
    
    # 检查文件或目录是否可读,mode=4
    > file.access(df, 4) == 0
    ./a1     ./create ./readme.txt        ./tmp
    TRUE         TRUE         TRUE         TRUE
    

    修改目录权限。

    
    # 修改目录权限,所有用户只读
    > Sys.chmod("./create", mode = "0555", use_umask = TRUE)
    
    # 查看目录完整信息,mode=555
    >  file.info("./create")
             size isdir mode               mtime               ctime               atime  uid  gid uname grname
    ./create 4096  TRUE  555 2013-11-14 08:36:28 2013-11-14 09:07:05 2013-11-14 08:36:39 1000 1000 conan  conan
    
    # create目录不可以写
    > file.access(df, 2) == 0
    ./a1     ./create ./readme.txt        ./tmp
    TRUE        FALSE         TRUE         TRUE
    

    2.5 对目录重名

    
    # 对tmp目录重命名
    > file.rename("tmp", "tmp2")
    [1] TRUE
    
    # 查看目录
    > dir()
    [1] "a1"         "create"     "readme.txt" "tmp2"
    

    2.6 删除目录

    
    # 删除tmp2目录
    > unlink("tmp2", recursive = TRUE)
    
    # 查看目录
    > dir()
    [1] "a1"         "create"     "readme.txt"
    

    2.7 其他功能函数

    拼接目录字符串

    
    # 拼接目录字符串
    > file.path("p1","p2","p3")
    [1] "p1/p2/p3"
    
    > dir(file.path("a1","b2"))
    [1] "c3"
    

    获取最底层的子目录名

    
    # 当前目录
    > getwd()
    [1] "/home/conan/R/fs"
    
    # 最底层子目录
    > dirname("/home/conan/R/fs/readme.txt")
    [1] "/home/conan/R/fs"
    
    # 最底层子目录或文件名
    > basename(getwd())
    [1] "fs"
    >  basename("/home/conan/R/fs/readme.txt")
    [1] "readme.txt"
    

    转换文件扩展路径

    
    # 转换~为用户目录
    > path.expand("~/foo")
    [1] "/home/conan/foo"
    

    标准化路径,用来转换win或linux的路径分隔符

    
    # linux
    > normalizePath(c(R.home(), tempdir()))
    [1] "/usr/lib/R"      "/tmp/RtmpqNyjPD"
    
    # win
    > normalizePath(c(R.home(), tempdir()))
    [1] "C:\Program Files\R\R-3.0.1"
    [2] "C:\Users\Administrator\AppData\Local\Temp\RtmpMtSnci"
    

    短路径,缩减路径的显示长度,只在win中运行。

    
    # win
    > shortPathName(c(R.home(), tempdir()))
    [1] "C:\PROGRA~1\R\R-30~1.1"
    [2] "C:\Users\ADMINI~1\AppData\Local\Temp\RTMPMT~1"
    

    3. 文件操作

    3.1 查看文件

    
    > dir()
    [1]  "create"  "readme.txt"
    
    # 检查文件是否存在
    > file.exists("readme.txt")
    [1] TRUE
    
    # 文件不存在
    > file.exists("readme.txt222")
    [1] FALSE
    
    # 查看文件完整信息
    > file.info("readme.txt")
               size isdir mode               mtime               ctime               atime  uid  gid uname grname
    readme.txt    7 FALSE  664 2013-11-14 08:24:50 2013-11-14 08:24:50 2013-11-14 08:24:50 1000 1000 conan  conan
    
    # 查看文件访问权限,存在
    >  file.access("readme.txt",0)
    readme.txt
             0
    # 不可执行
    >  file.access("readme.txt",1)
    readme.txt
            -1
    # 可写
    >  file.access("readme.txt",2)
    readme.txt
             0
    # 可读
    >  file.access("readme.txt",4)
    readme.txt
             0
    
    # 查看一个不存在的文件访问权限,不存在
    > file.access("readme.txt222")
    readme.txt222
               -1
    

    判断是文件还是目录。

    
    # 判断是否是目录
    > file_test("-d", "readme.txt")
    [1] FALSE
    > file_test("-d", "create")
    [1] TRUE
    
    # 判断是否是文件
    > file_test("-f", "readme.txt")
    [1] TRUE
    > file_test("-f", "create")
    [1] FALSE
    

    3.2 创建文件

    
    # 创建一个空文件 A.txt
    > file.create("A.txt")
    [1] TRUE
    
    # 创建一个有内容的文件 B.txt
    > cat("file B
    ", file = "B.txt")
    > dir()
    [1] "A.txt"      "B.txt"      "create"     "readme.txt"
    
    # 打印A.txt
    > readLines("A.txt")
    character(0)
    
    # 打印B.txt
    > readLines("B.txt")
    [1] "file B"
    

    把文件B.txt的内容,合并到 A.txt。

    
    # 合并文件
    > file.append("A.txt", rep("B.txt", 10))
     [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
    
    # 查看文件内容
    > readLines("A.txt")
     [1] "file B" "file B" "file B" "file B" "file B" "file B" "file B" "file B" "file B" "file B"
    

    把文件A.txt复制到文件C.txt

    
    # 复制文件
    > file.copy("A.txt", "C.txt")
    [1] TRUE
    
    # 查看文件内容
    > readLines("C.txt")
     [1] "file B" "file B" "file B" "file B" "file B" "file B" "file B" "file B" "file B" "file B"
    

    3.3 修改文件权限

    
    # 修改文件权限,创建者可读可写可执行,其他人无权限
    > Sys.chmod("A.txt", mode = "0700", use_umask = TRUE)
    
    # 查看文件信息
    > file.info("A.txt")
          size isdir mode               mtime               ctime               atime  uid  gid uname grname
    A.txt   70 FALSE  700 2013-11-14 12:55:18 2013-11-14 12:57:39 2013-11-14 12:55:26 1000 1000 conan  conan
    

    3.4 文件重命名

    
    # 给文件A.txt重命名为AA.txt
    > file.rename("A.txt","AA.txt")
    [1] TRUE
    > dir()
    [1] "AA.txt"     "B.txt"      "create"     "C.txt"      "readme.txt"
    

    3.5 硬连接和软连接

    • 硬连接,指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
    • 软连接,也叫符号连接(Symbolic Link)。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

    硬连接和软连接,只在Linux系统中使用。

    
    # 硬连接
    > file.link("readme.txt", "hard_link.txt")
    [1] TRUE
    
    # 软连接
    > file.symlink("readme.txt", "soft_link.txt")
    [1] TRUE
    
    # 查看文件目录
    > system("ls -l")
    -rwx------ 1 conan conan   70 Nov 14 12:55 AA.txt
    -rw-rw-r-- 1 conan conan    7 Nov 14 12:51 B.txt
    dr-xr-xr-x 2 conan conan 4096 Nov 14 08:36 create
    -rw-rw-r-- 1 conan conan   70 Nov 14 12:56 C.txt
    -rw-rw-r-- 2 conan conan    7 Nov 14 08:24 hard_link.txt
    -rw-rw-r-- 2 conan conan    7 Nov 14 08:24 readme.txt
    lrwxrwxrwx 1 conan conan   10 Nov 14 13:11 soft_link.txt -> readme.txt
    

    文件hard_link.txt是文件readme.txt硬连接文件,文件soft_link.txt是文件readme.txt软连接文件,

    3.5 删除文件

    有两个函数可以使用file.remove和unlink,其中unlink函数使用同删除目录操作是一样的。

    
    # 删除文件
    > file.remove("A.txt", "B.txt", "C.txt")
    [1] FALSE  TRUE  TRUE
    
    # 删除文件
    > unlink("readme.txt")
    
    # 查看目录文件
    > system("ls -l")
    total 12
    -rwx------ 1 conan conan   70 Nov 14 12:55 AA.txt
    dr-xr-xr-x 2 conan conan 4096 Nov 14 08:36 create
    -rw-rw-r-- 1 conan conan    7 Nov 14 08:24 hard_link.txt
    lrwxrwxrwx 1 conan conan   10 Nov 14 13:11 soft_link.txt -> readme.txt
    
    # 打印硬连接文件
    > readLines("hard_link.txt")
    [1] "file A"
    
    # 打印软连接文件,soft_link.txt,由于原文件被删除,有错误
    > readLines("soft_link.txt")
    Error in file(con, "r") : cannot open the connection
    In addition: Warning message:
    In file(con, "r") :
      cannot open file 'soft_link.txt': No such file or directory
    

    4. 几个特殊的目录

    • R.home() 查看R软件的相关目录
    • .Library 查看R核心包的目录
    • .Library.site 查看R核心包的目录和root用户安装包目录
    • .libPaths() 查看R所有包的存放目录
    • system.file() 查看指定包所在的目录

    4.1 R.home() 查看R软件的相关目录

    
    # 打印R软件安装目录
    > R.home()
    [1] "/usr/lib/R"
    
    # 打印R软件bin的目录
    > R.home(component="bin")
    [1] "/usr/lib/R/bin"
    
    # 打印R软件文件的目录
    >  R.home(component="doc")
    [1] "/usr/share/R/doc"
    

    通过系统命令,找到R文件的位置。

    
    # 检查系统中R文件的位置
    ~ whereis R
    R: /usr/bin/R /etc/R /usr/lib/R /usr/bin/X11/R /usr/local/lib/R /usr/share/R /usr/share/man/man1/R.1.gz
    
    # 打印环境变量R_HOME
    ~ echo $R_HOME
    /usr/lib/R
    

    通过R.home()函数,我们可以很容易的定位R软件的目录。

    4.2 R软件的包目录

    
    # 打印核心包的目录
    > .Library
    [1] "/usr/lib/R/library"
    
    # 打印核心包的目录和root用户安装包目录
    > .Library.site
    [1] "/usr/local/lib/R/site-library" "/usr/lib/R/site-library"
    [3] "/usr/lib/R/library"
    
    # 打印所有包的存放目录
    > .libPaths()
    [1] "/home/conan/R/x86_64-pc-linux-gnu-library/3.0"
    [2] "/usr/local/lib/R/site-library"
    [3] "/usr/lib/R/site-library"
    [4] "/usr/lib/R/library"
    

    4.3 查看指定包所在的目录

    
    # base包的存放目录
    > system.file()
    [1] "/usr/lib/R/library/base"
    
    # pryr包的存放目录
    >  system.file(package = "pryr")
    [1] "/home/conan/R/x86_64-pc-linux-gnu-library/3.0/pryr"
    

    REF:

    http://blog.fens.me/r-file-folder/

  • 相关阅读:
    idea中导入jquery无法生效解决办法
    如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的?
    spring的ioc依赖注入的三种方法(xml方式)
    向存在外键的表中插入数据时出错的原因以及插入外键为空的方法
    mysql一条语句添加多条数据
    SQL中distinct的用法
    Java实体对象为什么要实现Serializable接口?
    servlet中使用request.getHeader("referer")获取页面从哪跳转过来的
    java动态拼接sql语句并且执行时给sql语句的参数赋值
    正则表达式
  • 原文地址:https://www.cnblogs.com/emanlee/p/6959179.html
Copyright © 2011-2022 走看看