Как скачивать файлы с yandex диска на Google Colab по WebDav

Иногда необходимо скачать файлы в Google Colab выложенные на Yandex.Drive. Хотя я предпочитаю ftp или http сервера, поскольку там можно убрать авторизацию.

Для начала нужно установить на Google Colab консольный клиент WebDav:

!sudo apt-get install cadaver

Проверяем, что клиент установлен и нормально работает:

!cadaver https://webdav.yandex.ru

При дисконнекте потребуется устанавливать слиента вновь, поскольу Google Colab сбрасывает все окружение.

Будет запрошен логин и пароль для доступа к yandex.disk. После появится запрос на ввод команды. Вводим ls для получения списка файлов:

dav:/> ls
Listing collection `/': succeeded.

У меня на Yandex.Disk была создана папка Colab в которой лежит dataset для анализа данных. Забрать его так:

dav:/> cd Colab
dav:/Colab/> ls
Listing collection `/Colab/': succeeded.
        creditcard.csv.zip              69155632  Nov 20 13:30
dav:/Colab/> get creditcard.csv.zip 

Поскольку каждый раз вводить логин и пароль не хочется, можно автоматизировать процесс. К сожалению, безопасного способа авторизации я не нашел. Хранить пароль в открытом виде в notepad неправильно.

!rm $HOME/.netrc
!echo "machine webdav.yandex.ru login YourYandexDriveLogin password YourYandexDrivePassword" > $HOME/.netrc
!chmod 600 $HOME/.netrc
!cat $HOME/.netrc
#!echo "$(cat $HOME/.netrc)"

Google Colab создает .netrc на текущую сессию. После дисконнекта или создания нового notepad-а файл отсутствует.

!rm cadaverrc
!rm creditcard.csv.zip
#!echo -e "open https://webdav.yandex.ru" >.cadaverrc
!echo -e "cd Colab" >cadaverrc
!echo -e "get creditcard.csv.zip\r" >>cadaverrc
!echo -e "exit\r" >>cadaverrc
!cat cadaverrc
!cadaver -r cadaverrc https://webdav.yandex.ru

Чтобы не страдать каждый раз с проверкой окружения, поскольку при каждом реконнекте notepad-а Google Colab сбрасывает созданные настройки, написал функцию проверяющую все условия:

import os

#Load file to Google Colab from WebDav
#site - WebDav host site. E.g. "webdav.yandex.ru"
#filepath - WebDav filepath. E.g. "Colab"
#filename - WebDav filename. E.g. "creditcard.csv.zip"
#login - WebDav login
#password - WebDav password
def loadFileFromWebDav(site, filepath, filename, login, password):
  if os.path.isfile(filename):
    return    

  netrc = os.environ['HOME'] + "/.netrc"

  if not os.path.isfile(netrc): #Check if .netrc file for WebDav access exists
    #!rm $netrc
    netrcText = "machine " + site + " login " + login + " password " + password
    !echo $netrcText > $netrc
    !chmod 600 $netrc
    !cat $netrc

  result = !cadaver --version #Check if WebDav console client cadaver is installed
  if "command not found" in result: 
    !sudo apt-get install cadaver

  result = !cadaver --version
  if not ("command not found" in result): #Create file to get the file from WebDav 
    #!rm .cadaverrc
    cadaverrc = "cd " + filepath + "\r\n"
    cadaverrc += "get " + filename + "\r\n"
    cadaverrc += "exit\r\n"

    file1 = open("cadaverrc","w") 
    file1.write(cadaverrc)
    file1.close() 
    !cat "cadaverrc"

    webdavurl = "https://" + site 
    !cadaver -r cadaverrc $webdavurl       

    if ".zip" in filename: #Unpack file if it was compressed by zip
      !unzip $filename

Запускаем функцию для получения файла с WebDav сервера:

!rm .cadaverrc
!rm creditcard.csv.zip
loadFileFromWebDav("webdav.yandex.ru", "Colab", "creditcard.csv.zip", "login", "password")
Spread the love
Запись опубликована в рубрике IT рецепты. Добавьте в закладки постоянную ссылку.

Добавить комментарий