Как переименовать имена файлов с учетом их идентификаторов - PullRequest
0 голосов
/ 24 января 2019

Я новичок в программировании на R.Я скачал много фотографий, которые имеют свое имя в качестве имениНапример, картинки "senador588", "senador3", "senador16" и так далее.На каждой фотографии изображен один сенатор из Бразилии.Мне нужно имя вместо удостоверения личности.

У меня также есть фрейм данных, который отображает только идентификатор (id_senador) и имя (name_lower).

В этой первой части кода загружаются все изображения:

library(data.table)
library(rvest)
library(lubridate)
library(stringr)
library(dplyr)
library(RCurl)
library(XML)
library(httr)
library(purrr)
# all the senators of Brazil
url <- "https://www25.senado.leg.br/web/senadores/em-exercicio/-/e/por-nome"


# get all url on the webpage
url2 <- getURL(url)
parsed <- htmlParse(url2)
links <- xpathSApply(parsed,path = "//a",xmlGetAttr,"href")

links <- do.call(rbind.data.frame, links) 

colnames(links)[1] <- "links" 


# filtering to get the urls of the senators
links_senador <- links %>%
  filter(links %like% "/senadores/senador/")

links_senador <- data.frame(links_senador)

# creating a new directory for the pics
setwd("~/Downloads/")
dir.create("senadores-new")
setwd("~/Downloads/senadores-new")

# running a loop to download all pictures
i <- 1
while(1 <= 81){
  tryCatch({
# defining the row of each senator
  foto_webpage <- data.frame(links_senador$links[i])
# renaming the column's name
  colnames(foto_webpage) <- "links" 
# getting all images of html page
# filtering the photo which we want
  html <- as.character(foto_webpage$links) %>%
    httr::GET() %>%
    xml2::read_html() %>%
    rvest::html_nodes("img") %>%
    map(xml_attrs) %>%
    map_df(~as.list(.)) %>%
    filter(src %like% "senadores/img/fotos-oficiais/") %>%
    as.data.frame(html)
# downloading the photo
    foto_senador <- html$src
    download.file(foto_senador, basename(foto_senador), mode = "wb", header = TRUE)
    Sys.sleep(3)
  }, error = function(e) return(NULL)
  )
  i <- i + 1
}

Эта вторая часть создает фрейм данных с идентификатором и именем каждого сенатора:

url <- "https://www25.senado.leg.br/web/senadores/em-exercicio/-/e/por-nome"

file <- read_html(url)
tables <- html_nodes(file, "table")
table1 <- html_table(tables[1], fill = TRUE, header = T)


table1_df <- as.data.frame(table1)[1]

table1_df_sem_acentuacao <- as.data.frame(iconv(table1_df$Nome, from = "UTF-8", to = "ASCII//TRANSLIT"))
colnames(table1_df_sem_acentuacao) <- "senador_lower"

table1_df_lower <- as.data.frame(tolower(table1_df_sem_acentuacao$senador_lower))
colnames(table1_df_lower) <- "senador_lower"

table_name_final <- as.data.frame(gsub(" ", "-", table1_df_lower$senador_lower))

id_split <- as.data.frame(gsub("https://www25.senado.leg.br/web/senadores/senador/-/perfil/", "senador", links_senador$links))

table_dfs_final <- cbind(table_name_final, id_split)
colnames(table_dfs_final)[1] <- "name_lower"
colnames(table_dfs_final)[2] <- "id_senador"

Чтобы цикл заменил идентификатор для имени, я попытался это сделать:

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

  #optional
  cat("renaming", basename(p), "to", name, "\n")
}

1 Ответ

0 голосов
/ 24 января 2019

Чтобы сделать его более «R way», вы можете использовать одну из функций семейства apply. создайте свою функцию, которая изменяет имена, а затем просто применяйте ее к созданным вами столбцам идентификаторов и имен.

changeName<- function(old_name, new_name){

  file.rename(paste0(old_name,'.jpg'), paste0(new_name,'.jpg'))
}


mapply(changeName, table_dfs_final$id_senador,table_dfs_final$name_lower)
...