首页 > 解决方案 > 如何在R中的循环内重命名多个文件

问题描述

我已经下载了每个副手的一张照片。我总共有 513 张照片(但我托管了一个包含 271 张照片的文件)。每张照片都以代理人的身份命名。我想把照片的名字改成副手的名字。这意味着“66179.jpg”文件将被命名为“norma-ayub.jpg”。

我有一列包含 ID(“uri”)及其名称(“name_lower”)。我尝试使用 download.file() 的“destfile”运行代码,但它只接收一个字符串。我不知道如何使用 file.rename()。

并且 rename_r_to_R 仅更改文件扩展名。

我是使用 R 的初学者。

CSV 文件: https ://gist.github.com/gabrielacaesar/3648cd61a02a3e407bf29b7410b92cec

照片: https ://github.com/gabrielacaesar/studyingR/blob/master/chamber-of-deputies-17jan2019-files.zip (不需要下载ZIP文件;运行下面的代码时,您也可以得到照片,但下载它们需要一些时间)

deputados <- fread("dep-legislatura56-14jan2019.csv")

i <- 1

while(i <= 514) {
  tryCatch({
    url <- deputados$uri[i]
    api_content <- rawToChar(GET(url)$content)
    pessoa_info <- jsonlite::fromJSON(api_content)
    pessoa_foto <- pessoa_info$dados$ultimoStatus$urlFoto
    download.file(pessoa_foto, basename(pessoa_foto), mode = "wb")
    Sys.sleep(0.5)
  }, error = function(e) return(NULL)
  )
  i <- i + 1
}

标签: rdata-analysisdata-manipulation

解决方案


我下载了您提供的文件,并分别将它们读入R或解压缩到新文件夹中:

df <- data.table::fread(
  "https://gist.githubusercontent.com/gabrielacaesar/3648cd61a02a3e407bf29b7410b92cec/raw/1d682d8fcdefce40ff95dbe57b05fa83a9c5e723/chamber-of-deputies-17jan2019", 
  sep = ",",
  header = TRUE)
download.file("https://github.com/gabrielacaesar/studyingR/raw/master/chamber-of-deputies-17jan2019-files.zip",
              destfile = "temp.zip")
dir.create("photos")
unzip("temp.zip", exdir = "photos")

然后我list.files用来获取所有照片的文件名,将它们与数据集匹配并重命名照片。这运行得非常快,如果重命名文件成功,最后一位将报告。

photos <- list.files(
  path = "photos", 
  recursive = TRUE,
  full.names = TRUE
)

for (p in photos) {
  id <- basename(p)
  id <- gsub(".jpg$", "", id)
  name <- df$name_lower[match(id, basename(df$uri))]
  fname <- paste0(dirname(p), "/", name, ".jpg")
  file.rename(p, fname)

# optional
  cat(
    "renaming", 
    basename(p), 
    "to", 
    name, 
    "succesful:", 
    ifelse(success, "Yes", "No"),
    "\n"
  )
}

推荐阅读