使用不以文件扩展名结尾的 URL 在 R 中下载文件
Download files in R with URLs that do not end with the file extensions
当 URL 不以“.zip”结尾时,有没有人有使用 R 下载 GTFS 的绝招?
例如,这有效:
download.file(url = "http://www.transperth.wa.gov.au/TimetablePDFs/GoogleTransit/Production/google_transit.zip", destfile = "temp.zip")
但以下创建的大小合适的文件无法打开:
download.file(url = "http://transitfeeds.com/p/ptv/497/latest/download", destfile = "temp.zip")
download.file(url = "http://transitfeeds.com/p/ptv/497/latest/download", destfile = "temp")
我怀疑我需要了解有关 url 的一些基本知识,但我不知道从哪里开始寻找,因此将不胜感激。
干杯,
安东尼
您的 link 可能是重定向。尝试使用此处描述的 httr
包 R 下载文件重定向错误
library(httr)
url <- "http://transitfeeds.com/p/ptv/497/latest/download"
GET(
url = url,
write_disk("gtfs.zip"),
verbose()
) -> res
我能够下载文件并打开它。如果可行,您可以删除 verbose() 部分。
@kukul1de 的回答就可以了。
我还注意到,transitfeeds links 到官方下载 URL。 link 位于“关于此 GTFS 提要”下的右侧(查看下图):
然后你可以右击select“复制Link位置”,这会给你官方的URL扩展名.zip
,你可以与 download.file()
.
结合使用
但是,这个特定的 URL links 到一个文件,它实际上是一个包含许多文件夹的 .zip
,每个文件夹包含一个不同的 GTFS 文件,而不是 .zip
GTFS 格式。
如果它是一个实际的 GTFS .zip
文件,您可以使用 {gtfstools}
或 {tidytransit}
来阅读它,但不幸的是文件格式不允许它。看看:
tmp <- tempfile(pattern = "gtfs", fileext = ".zip")
download.file(
"http://data.ptv.vic.gov.au/downloads/gtfs.zip",
destfile = tmp
)
zip::zip_list(tmp)
#> filename compressed_size uncompressed_size timestamp
#> 1 1/ 0 0 2021-02-22 19:23:20
#> 2 10/ 0 0 2021-02-22 19:23:20
#> 3 10/google_transit.zip 3231 4011 2021-02-22 19:09:56
#> 4 11/ 0 0 2021-02-22 19:23:20
#> 5 11/google_transit.zip 29966 32109 2021-02-22 19:10:12
#> 6 1/google_transit.zip 7262254 7625276 2021-02-22 19:01:56
#> 7 2/ 0 0 2021-02-22 19:23:20
#> 8 2/google_transit.zip 5667379 6269932 2021-02-22 19:03:34
#> 9 3/ 0 0 2021-02-22 19:23:20
#> 10 3/google_transit.zip 6714271 7782585 2021-02-22 19:05:04
#> 11 4/ 0 0 2021-02-22 19:23:20
#> 12 4/google_transit.zip 66336783 67508547 2021-02-22 19:23:16
#> 13 5/ 0 0 2021-02-22 19:23:20
#> 14 5/google_transit.zip 27834469 27962731 2021-02-22 19:06:16
#> 15 6/ 0 0 2021-02-22 19:23:20
#> 16 6/google_transit.zip 13730731 14172729 2021-02-22 19:09:10
#> 17 7/ 0 0 2021-02-22 19:23:20
#> 18 7/google_transit.zip 46932 50417 2021-02-22 19:09:24
#> 19 8/ 0 0 2021-02-22 19:23:20
#> 20 8/google_transit.zip 574316 580906 2021-02-22 19:09:42
假设您要读取 1/
文件夹中的 GTFS 文件。然后你可以用 zip::unzip()
:
解压这个文件
tmpd <- file.path(tempdir(), "tmp_gtfs")
dir.create(tmpd)
zip::unzip(tmp, files = "1/google_transit.zip", exdir = tmpd)
list.files(tmpd)
#> [1] "1"
list.files(file.path(tmpd, "1"))
#> [1] "google_transit.zip"
并用{gtfstools}
或{tidytransit}
阅读。这取决于你想对文件做什么:
gtfs_path <- file.path(tmpd, "1", "google_transit.zip")
gt_gtfs <- gtfstools::read_gtfs(gtfs_path)
names(gt_gtfs)
#> [1] "agency" "routes" "trips" "stops"
#> [5] "calendar" "calendar_dates" "shapes" "stop_times"
tt_gtfs <- tidytransit::read_gtfs(gtfs_path)
names(tt_gtfs)
#> [1] "agency" "routes" "trips" "stops"
#> [5] "calendar" "calendar_dates" "shapes" "stop_times"
当 URL 不以“.zip”结尾时,有没有人有使用 R 下载 GTFS 的绝招? 例如,这有效:
download.file(url = "http://www.transperth.wa.gov.au/TimetablePDFs/GoogleTransit/Production/google_transit.zip", destfile = "temp.zip")
但以下创建的大小合适的文件无法打开:
download.file(url = "http://transitfeeds.com/p/ptv/497/latest/download", destfile = "temp.zip")
download.file(url = "http://transitfeeds.com/p/ptv/497/latest/download", destfile = "temp")
我怀疑我需要了解有关 url 的一些基本知识,但我不知道从哪里开始寻找,因此将不胜感激。
干杯,
安东尼
您的 link 可能是重定向。尝试使用此处描述的 httr
包 R 下载文件重定向错误
library(httr)
url <- "http://transitfeeds.com/p/ptv/497/latest/download"
GET(
url = url,
write_disk("gtfs.zip"),
verbose()
) -> res
我能够下载文件并打开它。如果可行,您可以删除 verbose() 部分。
@kukul1de 的回答就可以了。
我还注意到,transitfeeds links 到官方下载 URL。 link 位于“关于此 GTFS 提要”下的右侧(查看下图):
然后你可以右击select“复制Link位置”,这会给你官方的URL扩展名.zip
,你可以与 download.file()
.
但是,这个特定的 URL links 到一个文件,它实际上是一个包含许多文件夹的 .zip
,每个文件夹包含一个不同的 GTFS 文件,而不是 .zip
GTFS 格式。
如果它是一个实际的 GTFS .zip
文件,您可以使用 {gtfstools}
或 {tidytransit}
来阅读它,但不幸的是文件格式不允许它。看看:
tmp <- tempfile(pattern = "gtfs", fileext = ".zip")
download.file(
"http://data.ptv.vic.gov.au/downloads/gtfs.zip",
destfile = tmp
)
zip::zip_list(tmp)
#> filename compressed_size uncompressed_size timestamp
#> 1 1/ 0 0 2021-02-22 19:23:20
#> 2 10/ 0 0 2021-02-22 19:23:20
#> 3 10/google_transit.zip 3231 4011 2021-02-22 19:09:56
#> 4 11/ 0 0 2021-02-22 19:23:20
#> 5 11/google_transit.zip 29966 32109 2021-02-22 19:10:12
#> 6 1/google_transit.zip 7262254 7625276 2021-02-22 19:01:56
#> 7 2/ 0 0 2021-02-22 19:23:20
#> 8 2/google_transit.zip 5667379 6269932 2021-02-22 19:03:34
#> 9 3/ 0 0 2021-02-22 19:23:20
#> 10 3/google_transit.zip 6714271 7782585 2021-02-22 19:05:04
#> 11 4/ 0 0 2021-02-22 19:23:20
#> 12 4/google_transit.zip 66336783 67508547 2021-02-22 19:23:16
#> 13 5/ 0 0 2021-02-22 19:23:20
#> 14 5/google_transit.zip 27834469 27962731 2021-02-22 19:06:16
#> 15 6/ 0 0 2021-02-22 19:23:20
#> 16 6/google_transit.zip 13730731 14172729 2021-02-22 19:09:10
#> 17 7/ 0 0 2021-02-22 19:23:20
#> 18 7/google_transit.zip 46932 50417 2021-02-22 19:09:24
#> 19 8/ 0 0 2021-02-22 19:23:20
#> 20 8/google_transit.zip 574316 580906 2021-02-22 19:09:42
假设您要读取 1/
文件夹中的 GTFS 文件。然后你可以用 zip::unzip()
:
tmpd <- file.path(tempdir(), "tmp_gtfs")
dir.create(tmpd)
zip::unzip(tmp, files = "1/google_transit.zip", exdir = tmpd)
list.files(tmpd)
#> [1] "1"
list.files(file.path(tmpd, "1"))
#> [1] "google_transit.zip"
并用{gtfstools}
或{tidytransit}
阅读。这取决于你想对文件做什么:
gtfs_path <- file.path(tmpd, "1", "google_transit.zip")
gt_gtfs <- gtfstools::read_gtfs(gtfs_path)
names(gt_gtfs)
#> [1] "agency" "routes" "trips" "stops"
#> [5] "calendar" "calendar_dates" "shapes" "stop_times"
tt_gtfs <- tidytransit::read_gtfs(gtfs_path)
names(tt_gtfs)
#> [1] "agency" "routes" "trips" "stops"
#> [5] "calendar" "calendar_dates" "shapes" "stop_times"