Dificuldade de listar arquivos de uma pasta do google drive com R

Problema: aparentemente tenho muitos arquivos no google drive, então o R, via API, não consegue listar todos os meus arquivos.

Arquivos <- drive_find(n_max = 30) #funciona!
Arquivos <- drive_ls(path = ‘~/pasta1/’) #funciona!

Porém

Arquivos <- drive_ls(path = ‘~/pasta1/pasta2/pasta3/pasta4/pasta5/’) #não funciona

Ao rodar essa função, o R vai varrendo os arquivos e solta a seguinte mensagem:

Files retrieved so far: num,
onde num vai variando conforme os arquivos vão sendo listados.

Exemplo de uso:

  • faço faculdade e tenho 6 matérias por semestre

  • cada matéria tem 6 unidades que vão de I a VI

  • cada unidade exige que se faça um relatório final para entregar

  • quero listar todos os relatórios de uma pasta específica

  • como meus relatórios chamam “Unidade I.pdf” independente da matéria não adianta usar a função * drive_find *, pois eu não sei qual matéria é a “dona” do arquivo Unidade I.pdf que aparece na lista.

Obs.: em python o código funciona em segundos.

service.files().list(q="'" + id_pasta + "' in parents").execute()

Obs.2: desculpem a falta de um exemplo reprodutível, mas não sei como criar um considerando o acesso ao drive.

Larissa, pela documentação do pacote googledrive, não parece existir mesmo um jeito de acelerar uma busca por caminho; o Drive sempre vai varrer todos os seus arquivos a menos que você forneça o ID do que você quer. Sendo assim, eu acho que você tem 2 opções: fazer um processo iterativo que busca uma parte do caminho de cada vez ou fazer a busca direto com o ID da pasta5.

Abaixo você pode ver o meu código para cada uma das estratégias (o arquivo que eu quero é ~/pasta1/pasta2/pasta3/doc):

  • No código da primeira opção, eu começo com o drive_find() que você diz funcionar. A partir daí, eu pego o ID da pasta, faço um drive_ls() usando esse ID e filtro os arquivos para que reste apenas a próxima pasta do caminho. Eu repito isso até chegar no doc.

  • No código da segunda opção, eu uso diretamente o ID da pasta3 e listo o seu conteúdo. Isso é equivalente às 2 últimas linhas da solução anterior e assume que você de fato já tem o ID da pasta3 (pelo seu código em Python, você parece ter sim esse ID).

# Achar um arquivo listando conteúdos
"pasta1" |>
  googledrive::drive_find(n_max = 30) |>
  dplyr::pull(id) |>
  googledrive::drive_ls() |>
  dplyr::filter(name == "pasta2") |>
  dplyr::pull(id) |>
  googledrive::drive_ls() |>
  dplyr::filter(name == "pasta3") |>
  dplyr::pull(id) |>
  googledrive::drive_ls()
#> # A dribble: 1 × 3
#>   name  id                                           drive_resource   
#>   <chr> <drv_id>                                     <list>           
#> 1 doc   1DJ5i7Jqm1zl_vEhfNYENUgsOV3s8G6OgQjw9fgpTOb4 <named list [35]>

# Pegar direto pelo ID da pasta3
googledrive::drive_ls(googledrive::as_id("18t1HL_xcZkE63ROhdpqgyg2me6WCrxzf"))
#> # A dribble: 1 × 3
#>   name  id                                           drive_resource   
#>   <chr> <drv_id>                                     <list>           
#> 1 doc   1DJ5i7Jqm1zl_vEhfNYENUgsOV3s8G6OgQjw9fgpTOb4 <named list [35]>

Created on 2022-12-05 with reprex v2.0.2

1 curtida