download.file() 下载损坏的 xls
download.file() download corrupt xls
我正在尝试创建一个包来从多米尼加共和国中央银行网页下载、导入和清理数据。我已经完成了 Rstudio.cloud 中的所有编码并且一切正常,但是当我在我的本地机器上尝试这些功能时它们不起作用。
仔细研究每个功能后,我意识到问题出在下载的文件上,它已损坏。
我包含函数的第一步只是为了说明我的问题。
# Packages
library(readxl)
# file url.
url <- paste0("https://cdn.bancentral.gov.do/documents/",
"estadisticas/precios/documents/",
"ipc_base_2010.xls?v=1570116997757")
# termporary path
file_path <- tempfile(pattern = "", fileext = ".xls")
# downloading
download.file(url, file_path, quiet = TRUE)
# reading the file
ipc_general <- readxl::read_excel(
file_path,
sheet = 1,
col_names = FALSE,
skip = 7
)
Error:
filepath: C:\Users\Johan Rosa\AppData\Local\Temp\RtmpQ1rOT3a74778a1a64.xls
libxls error: Unable to open file
我正在使用临时文件,但这不是问题所在,您可以尝试将文件下载到您的工作目录中,但问题仍然存在。
我想知道:
- 为什么此代码在 rstudio.clowd 而不是本地?
- 我该怎么做才能完成工作? (替代方法、包、函数)
对了,我用的是Windows10
编辑
答案:
1- Rstudio.cloud 在 linux 上运行,但对于 Windows,我需要对 download.file()
命令进行一些调整。
2- download.file(url, file_path, quiet = TRUE, mode = "wb")
这就是我要找的东西。
现在我有一个不同的问题。我必须想出一种方法来检测函数是 运行 on Linux 还是 Windows,以相应地设置该参数。
我可以使用 if
else
调用 .Platform$OS.type 结果来编写新的下载文件函数。
或者,我可以为所有 download.file() 调用设置模式 = "wb" 吗?
你有什么建议吗?
来自 download.file()
的文档
The choice of binary transfer (mode = "wb" or "ab") is important on
Windows, since unlike Unix-alikes it does distinguish between text and
binary files and for text transfers changes \n line endings to \r\n
(aka CRLF).
Code written to download binary files must use mode = "wb" (or "ab"),
but the problems incurred by a text transfer will only be seen on
Windows.
来源download.file
head(print(download.file),12)
1 function (url, destfile, method, quiet = FALSE, mode = "w", cacheOK = TRUE,
2 extra = getOption("download.file.extra"), headers = NULL,
3 ...)
4 {
5 destfile
6 method <- if (missing(method))
7 getOption("download.file.method", default = "auto")
8 else match.arg(method, c("auto", "internal", "wininet", "libcurl",
9 "wget", "curl", "lynx"))
10 if (missing(mode) && length(grep("\\.(gz|bz2|xz|tgz|zip|rd[as]|RData)$",
11 URLdecode(url))))
12 mode <- "wb"
所以查看源代码,如果你没有设置模式,该函数会自动使用 "w",除了 URL 包含 gz、bz2、xz 等(这就是你得到的原因第一个错误)。
以我的拙见,我认为在 Unix-alikes(例如 Linux)中,"w" 和 "wb" 是相同的,因为它们不区分文本文件和二进制文件,但是 Windows 会。
所以你可以设置mode="wd"给所有的download.file调用(只要不是Windows下的文本传输),这不会影响Linux.
我正在尝试创建一个包来从多米尼加共和国中央银行网页下载、导入和清理数据。我已经完成了 Rstudio.cloud 中的所有编码并且一切正常,但是当我在我的本地机器上尝试这些功能时它们不起作用。
仔细研究每个功能后,我意识到问题出在下载的文件上,它已损坏。
我包含函数的第一步只是为了说明我的问题。
# Packages
library(readxl)
# file url.
url <- paste0("https://cdn.bancentral.gov.do/documents/",
"estadisticas/precios/documents/",
"ipc_base_2010.xls?v=1570116997757")
# termporary path
file_path <- tempfile(pattern = "", fileext = ".xls")
# downloading
download.file(url, file_path, quiet = TRUE)
# reading the file
ipc_general <- readxl::read_excel(
file_path,
sheet = 1,
col_names = FALSE,
skip = 7
)
Error:
filepath: C:\Users\Johan Rosa\AppData\Local\Temp\RtmpQ1rOT3a74778a1a64.xls
libxls error: Unable to open file
我正在使用临时文件,但这不是问题所在,您可以尝试将文件下载到您的工作目录中,但问题仍然存在。
我想知道:
- 为什么此代码在 rstudio.clowd 而不是本地?
- 我该怎么做才能完成工作? (替代方法、包、函数)
对了,我用的是Windows10
编辑
答案:
1- Rstudio.cloud 在 linux 上运行,但对于 Windows,我需要对 download.file()
命令进行一些调整。
2- download.file(url, file_path, quiet = TRUE, mode = "wb")
这就是我要找的东西。
现在我有一个不同的问题。我必须想出一种方法来检测函数是 运行 on Linux 还是 Windows,以相应地设置该参数。
我可以使用 if
else
调用 .Platform$OS.type 结果来编写新的下载文件函数。
或者,我可以为所有 download.file() 调用设置模式 = "wb" 吗?
你有什么建议吗?
来自 download.file()
The choice of binary transfer (mode = "wb" or "ab") is important on Windows, since unlike Unix-alikes it does distinguish between text and binary files and for text transfers changes \n line endings to \r\n (aka CRLF).
Code written to download binary files must use mode = "wb" (or "ab"), but the problems incurred by a text transfer will only be seen on Windows.
来源download.file
head(print(download.file),12)
1 function (url, destfile, method, quiet = FALSE, mode = "w", cacheOK = TRUE,
2 extra = getOption("download.file.extra"), headers = NULL,
3 ...)
4 {
5 destfile
6 method <- if (missing(method))
7 getOption("download.file.method", default = "auto")
8 else match.arg(method, c("auto", "internal", "wininet", "libcurl",
9 "wget", "curl", "lynx"))
10 if (missing(mode) && length(grep("\\.(gz|bz2|xz|tgz|zip|rd[as]|RData)$",
11 URLdecode(url))))
12 mode <- "wb"
所以查看源代码,如果你没有设置模式,该函数会自动使用 "w",除了 URL 包含 gz、bz2、xz 等(这就是你得到的原因第一个错误)。
以我的拙见,我认为在 Unix-alikes(例如 Linux)中,"w" 和 "wb" 是相同的,因为它们不区分文本文件和二进制文件,但是 Windows 会。
所以你可以设置mode="wd"给所有的download.file调用(只要不是Windows下的文本传输),这不会影响Linux.