R8—批量生成文件夹,批量读取文件夹名称+R文件管理系统操作函数

一. 批量生成文件夹,批量读取文件夹名称

今日,工作中遇到这样一个问题:boss给我们提供了200多家公司的ID代码(如6007、7920等),需要根据这些ID号去搜索下载新闻,从而将下载到的新闻存到以公司ID生成的指定文件夹下!所以第一个问题就是200多个公司,不可能每一次下载,都要去点击:新建文件夹,然后对文件夹命名,too boring and monotonous。嘿嘿,幸好有R的陪伴! let’s do it,来看看R如何完成这些工作!

主要用到两个函数

一. dir.create—生成文件夹                二. dir—读取文件夹名

首先,读取ID号(之前已将其存到txt文件中)

> fileNames<-read.table(‘C:/Users/wb-tangyang.b/Desktop/key.txt‘)
# 生成这样的一列
> fileNames[1,1]
[1] 16101
然后,根据fileName中的元素批量生成文件夹!
>i=1  # 指定初始行号!
>while(i<=84) { # 84为文件夹的数量,这里可以任意指定!
 dir.create(as.character(fileNames[i,1]))
 i=i+1
}

最后,查看一下!文件夹已悉数到位,哈哈!nice吧



那么反过来该如何操作呢? 即想读取存在电脑里的N多文件夹的名称,以备后续使用,只需一个命令dir即可!

> fileName<-dir(‘E:/工作/新闻数据下载/tyNews2014/公司KEY‘)

得到的fileName是一个字符向量,我们需要将其转化成数值型,并存在一列的形式!

> fileName<-as.numeric(fileName)
> matrix(data = fileName,nrow = 138,ncol = 1)

yeah,这就是我们想要的东东!


二. 用R进行文件系统管理

前言

R语言作为脚本语言,有一套文件系统管理的功能函数,也可以实现如Python一样的系统管理功能。本文将详细介绍,R语言的文件系统管理。试试有什么不样吧?

目录

  1. 文件系统介绍
  2. 目录操作
  3. 文件操作
  4. 几个特殊的目录

1. 文件系统介绍

计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。

R语言和其他编程语言一样,都有对文件系统的操作,包括文件操作和目录操作,函数API都定义在base包中。

2. 目录操作

系统环境:Linux: Ubuntu Server 12.04.2 LTS 64bit ; R: 3.1.0 x86_64-pc-linux-gnu

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\n", 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"
其实,用R语言操作文件系统还是很方便的。但对于函数命名确实不太规范,需要我们花时间记忆

简要总结(下面的不齐全,改天补齐)


rm(list=ls())

path = ‘J:/lab/EX29 --在R语言中进行文件(夹)操作‘

setwd(path)

cat("file A\n", file="A") #创建一个文件A,文件内容是‘file A‘,‘\n‘表示换行,这是一个很好的习惯

cat("file B\n", file="B")  #创建一个文件B

file.append("A", "B")  #将文件B的内容附到A内容的后面,注意没有空行

file.create("A")  #创建一个文件A, 注意会覆盖原来的文件

file.append("A", rep("B", 10)) #将文件B的内容复制10便,并先后附到文件A内容后

file.show("A")  #新开工作窗口显示文件A的内容

file.copy("A", "C") #复制文件A保存为C文件,同一个文件夹

dir.create("tmp")  #创建名为tmp的文件夹

file.copy(c("A", "B"), "tmp") #将文件夹拷贝到tmp文件夹中

list.files("tmp")  #查看文件夹tmp中的文件名

unlink("tmp", recursive=F) #如果文件夹tmp为空,删除文件夹tmp

unlink("tmp", recursive=TRUE) #删除文件夹tmp,如果其中有文件一并删除

file.remove("A", "B", "C")  #移除三个文件

时间: 2024-09-29 03:50:11

R8—批量生成文件夹,批量读取文件夹名称+R文件管理系统操作函数的相关文章

windows下PHP批量生成打包android程序APK-渠道txt植入apk文件

服务器安装php环境 下载 android-sdk-windows  下载JDK 1.打开zip支持 c:/windows/php.ini ,打开 exec 2.apk 支持mime添加 .apk application/vnd.android.package-archive 3.安装javaSDK(要和android的编辑版本一致) 4.编辑IIS绑定权限(www:www) ,目录没有权限会导致生成失败 5.配置两个虚拟主机 A:down.coolaj.cn  用于下载 B:make.cook

pdmreader支持读取xml格式的pdm文件,无法读取二进制格式的pdm文件。

您的Pdm数据字典文件可能不被PDMReader读取,可能是因为pdm文件版本的问题.但 您可以通过PowerDesigner12(下载PowerDesigner12)进行转换 后进行读取. 您要做的就是将bin格式的pdm文件转换为xml格式的pdm文件.如下图.(建议使用PowerDesigner12版本进行转换) 1.转换为XML格式很简单, 用PowerDesigener 12.0(下载PowerDesigner12),打开 您的*.PDM文件    2.选择FILE,然后选择save

C# 读取大文件 (可以读取3GB大小的txt文件)

在处理大数据时,有可能 会碰到 超过3GB大小的文件,如果通过 记事本 或 NotePad++去打开它,会报错,读不到任何文件. 如果你只是希望读取这文件中的前几行,怎么办,下面的工具会帮您解决这个问题. 而且读取时间很快. 工具下载地址: http://pan.baidu.com/s/1y34wt      (15KB左右, 备注:要运行这个工具,需要您的机器已装过 .netFramework4.0 ) 源代码下载地址:http://pan.baidu.com/s/1jAyjl       

c# 用OpenXmL读取.xlsx格式的Excel文件 返回DataTable

1.须要引用的dll :  DocumentFormat.OpenXml.dll  ---须要安装一下OpenXml再引用 WindowsBase  ---直接在项目里加入引用 2.方法: /// <summary> /// 读取.xlsx格式的Excel文件数据,读取其特定名称的工作薄 /// </summary> /// <param name="filePath">文件路径 如 D:\\excel1.xls</param> ///

Eclipse中R文件不能自动生成

R文件不能自动生成主要是因为编译有错误,这时你想什么办法都是没有用的,clean, fix properties,都不是从根上解决问题. R文件主要是自动生成资源文件的id的,里边静态子类 主要都是对 res目录下的资源文件的引用 所以,只要是R文件不能自动生成或更新,主要是因为 编译的时候资源文件里有不合法的语法. 所以,遇到这种情况的话,不要去乱修改别的地方,一般会使问题变得更复杂. 解决方法: 1.如果console里有红色的编译不过的报错信息,直接定位到报错位置,修改错误OK! 2.首先

Android开发问题之R文件丢失

问题解析:1.有时候我们打开Android工程时,会发现gen文件夹下的R文件丢失了,这种情况的发生一般是发在在导入其他Android工程之后,原因是sdk版本问题:2.如果工程已经在eclipse软件中,可能是xml文件错误导致的. 解决方法:1.找到菜单栏中“项目”(project)选项下的“清理”(clean),然后在弹出的对话框中选择你要清理的工程:2.如果没有效果,可以选中项目名称,右击选择“源代码”->“清理”,确定完成.虽然两者都是清理操作,但感觉效果是不一样的:3.如果还是没有出

Python文件与目录(第三章:文件与目录)

本章介绍python中用来读写文件以及访问目录内容的函数和类型.python提供了丰富的输入输出函数,本章将介绍其中使用广泛的那些函数,首先介绍文件对象,它是python中实现输入输出的基本方法,之后将介绍用于操作路径,获取文件信息和访问目录内容的函数. 3.1文件对象 在windows路径名称中,必须在路径中队反斜杠转义,即每次用两个反斜杠,例如,路径C:\windows\temp,用python字符串C:\\windows\\temp,或者放置一个r取消字符串中队反斜杠的特殊处理,r"C:\

你绝对想不到R文件找不到(cannot resolve symbol R)的原因

你绝对想不到R文件找不到(cannot resolve symbol R)的原因 最近在项目开发中 Android Studio 的 R 文件突然找不到了.IDE 中出现了以下提示 cannot resolve symbol R Clean And Rebuild 一般来说看到这个错误随便 Google baidu 回来的答案无非就是 clean -> rebuild 工程 而我的本能反应也是如此然而一点用都没有! 资源id冲突 虽然整个工程涉及到 R 文件都无法找到,但是跑起来却是正常,完全没

文件操作函数及文件流详解

这几天着重研究了一下文件操作函数的原理及实现,在这里与大家分享一下----开心 1.文件流 2.几种文件操作函数 (1)  fopen (2) fclose (3)fread (4)fwrite (5)fgets (6)fputs 先来看FILE结构体: #ifndef _FILE_DEFINED struct _iobuf { char *_ptr;//文件缓存的当前位置 int _cnt;//缓存里可以读取的字节数 char *_base;//文件缓存的起始位置 int _flag; int