如何在打开前检查文件大小?
How to check file size before opening?
如何在将文件加载到 R 之前检查文件的大小?
例如:
http://math.ucdenver.edu/RTutorial/titanic.txt
我想根据文件的大小使用最佳命令打开文件。
使用file.info()
file.info("data/ullyses.txt")
size isdir mode mtime ctime atime uid gid
data/ullyses.txt 1573151 FALSE 664 2015-06-01 15:25:55 2015-06-01 15:25:55 2015-06-01 15:25:55 1008 1008
然后提取名为 size
的列:
file.info("data/ullyses.txt")$size
[1] 1573151
如果你不想在知道文件大小之前下载文件,你可以试试这样:
注意:这仅适用于 Mac 或 Linux。
file_url = 'http://math.ucdenver.edu/RTutorial/titanic.txt'
curl_cmd = paste('curl -X HEAD -i', file_url)
system_cmd = paste(curl_cmd, '|grep Content-Length |cut -d : -f 2')
上面将使用system()
将要执行的字符串打包在一起。 curl_cmd
字符串告诉 curl 只获取文件的 header。
system_cmd
字符串打包一些额外的命令来解析 header 并仅提取文件大小。
现在,调用 system()
并使用 intern = TRUE
参数告诉 R 保留输出。
b <- system(system_cmd, intern = TRUE)
## % Total % Received % Xferd Average Speed Time Time Time Current
## Dload Upload Total Spent Left Speed
## 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
## curl: (18) transfer closed
它将只下载文件的 header 并解析它以获得文件大小。现在 b
将是文件大小(以字节为单位)。
然后你可以决定如何打开文件,或者打印一些友好的东西,比如:
print(paste("There are", as.numeric(b)/1e6, "mb in the file:", file_url))
## [1] "There are 0.055692 mb in the file: http://math.ucdenver.edu/RTutorial/titanic.txt"
library(RCurl)
url = "http://math.ucdenver.edu/RTutorial/titanic.txt"
xx = getURL(url, nobody=1L, header=1L)
strsplit(xx, "\r\n")
也许自从这次讨论以来已经添加了它,但至少对于 R3.4+,答案是 file.size
。
除了上面提到的 file.size
之外,您还可以使用包 fs
中的 file_size
,这将在更多 human-readable 输出中打印大小,显示 MB 或 GB而不是字节。
作为例子,比较两个函数返回的输出:
library(fs)
file.size(system.file("data/Rdata.rdb", package = "datasets"))
#> [1] 114974
fs::file_size(system.file("data/Rdata.rdb", package = "datasets"))
#> 112K
file.size(system.file("data/Rdata.rdb", package = "spData"))
#> [1] 2676333
fs::file_size(system.file("data/Rdata.rdb", package = "spData"))
#> 2.55M
如何在将文件加载到 R 之前检查文件的大小?
例如:
http://math.ucdenver.edu/RTutorial/titanic.txt
我想根据文件的大小使用最佳命令打开文件。
使用file.info()
file.info("data/ullyses.txt")
size isdir mode mtime ctime atime uid gid
data/ullyses.txt 1573151 FALSE 664 2015-06-01 15:25:55 2015-06-01 15:25:55 2015-06-01 15:25:55 1008 1008
然后提取名为 size
的列:
file.info("data/ullyses.txt")$size
[1] 1573151
如果你不想在知道文件大小之前下载文件,你可以试试这样:
注意:这仅适用于 Mac 或 Linux。
file_url = 'http://math.ucdenver.edu/RTutorial/titanic.txt'
curl_cmd = paste('curl -X HEAD -i', file_url)
system_cmd = paste(curl_cmd, '|grep Content-Length |cut -d : -f 2')
上面将使用system()
将要执行的字符串打包在一起。 curl_cmd
字符串告诉 curl 只获取文件的 header。
system_cmd
字符串打包一些额外的命令来解析 header 并仅提取文件大小。
现在,调用 system()
并使用 intern = TRUE
参数告诉 R 保留输出。
b <- system(system_cmd, intern = TRUE)
## % Total % Received % Xferd Average Speed Time Time Time Current
## Dload Upload Total Spent Left Speed
## 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
## curl: (18) transfer closed
它将只下载文件的 header 并解析它以获得文件大小。现在 b
将是文件大小(以字节为单位)。
然后你可以决定如何打开文件,或者打印一些友好的东西,比如:
print(paste("There are", as.numeric(b)/1e6, "mb in the file:", file_url))
## [1] "There are 0.055692 mb in the file: http://math.ucdenver.edu/RTutorial/titanic.txt"
library(RCurl)
url = "http://math.ucdenver.edu/RTutorial/titanic.txt"
xx = getURL(url, nobody=1L, header=1L)
strsplit(xx, "\r\n")
也许自从这次讨论以来已经添加了它,但至少对于 R3.4+,答案是 file.size
。
除了上面提到的 file.size
之外,您还可以使用包 fs
中的 file_size
,这将在更多 human-readable 输出中打印大小,显示 MB 或 GB而不是字节。
作为例子,比较两个函数返回的输出:
library(fs)
file.size(system.file("data/Rdata.rdb", package = "datasets"))
#> [1] 114974
fs::file_size(system.file("data/Rdata.rdb", package = "datasets"))
#> 112K
file.size(system.file("data/Rdata.rdb", package = "spData"))
#> [1] 2676333
fs::file_size(system.file("data/Rdata.rdb", package = "spData"))
#> 2.55M