Иногда необходимо скачать файлы в 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")