Google Colab: как читать данные с моего диска Google?
Проблема проста: у меня есть некоторые данные о gDrive, например, в /projects/my_project/my_data*
.
Также у меня есть простой ноутбук в gColab.
Итак, я хотел бы сделать что-то вроде:
for file in glob.glob("/projects/my_project/my_data*"):
do_something(file)
К сожалению, все примеры (например, https://colab.research.google.com/notebook#fileId=/v2/external/notebooks/io.ipynb, например) предлагают только загружать в ноутбук все необходимые данные.
Но, если у меня много кусочков данных, это может быть довольно сложно. Есть ли возможности решить эту проблему?
Спасибо за помощь!
Ответы
Ответ 1
Хорошие новости, PyDrive имеет первоклассную поддержку на CoLab! PyDrive - это оболочка для клиента python на Google Диске. Вот пример того, как вы будете загружать ВСЕ файлы из папки, аналогично использованию glob
+ *
:
!pip install -U -q PyDrive
import os
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials
# 1. Authenticate and create the PyDrive client.
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)
# choose a local (colab) directory to store the data.
local_download_path = os.path.expanduser('~/data')
try:
os.makedirs(local_download_path)
except: pass
# 2. Auto-iterate using the query syntax
# https://developers.google.com/drive/v2/web/search-parameters
file_list = drive.ListFile(
{'q': "'1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk' in parents"}).GetList()
for f in file_list:
# 3. Create & download by id.
print('title: %s, id: %s' % (f['title'], f['id']))
fname = os.path.join(local_download_path, f['title'])
print('downloading to {}'.format(fname))
f_ = drive.CreateFile({'id': f['id']})
f_.GetContentFile(fname)
with open(fname, 'r') as f:
print(f.read())
Обратите внимание, что аргументы для drive.ListFile
- это словарь, который совпадает с параметрами, используемыми API-интерфейсом Google Drive HTTP (вы можете настроить параметр q
который будет настроен на ваш прецедент).
Знайте, что во всех случаях файлы/папки кодируются с помощью id (peep 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk) на Google Диске. Для этого требуется, чтобы вы искали Google Диск для определенного идентификатора, соответствующего папке, в которую вы хотите запустить ваш поиск.
Например, перейдите к папке "/projects/my_project/my_data"
, расположенной на вашем Google Диске.
![Google Drive]()
Смотрите, что он содержит некоторые файлы, в которые мы хотим скачать CoLab. Чтобы получить идентификатор папки, чтобы использовать ее PyDrive, просмотрите URL-адрес и извлеките параметр id. В этом случае URL, соответствующий папке, был:
![https://drive.google.com/drive/folders/1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk]()
Где id - последний фрагмент URL: 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk.
Ответ 2
Вы можете монтировать ваши файлы Google Диска, выполнив следующий фрагмент кода:
from google.colab import drive
drive.mount('/content/drive')
Затем вы можете взаимодействовать с файлами Диска на боковой панели файлового браузера или с помощью утилит командной строки.
Вот пример ноутбука
Ответ 3
Спасибо за отличные ответы! Самый быстрый способ получить несколько одноразовых файлов в Colab с диска Google. Загрузите помощник Drive и установите
from google.colab import drive
Это потребует авторизации.
drive.mount('/content/drive')
Откройте ссылку в новом tab->, вы получите копию кода, которая возвращается в приглашение, которое теперь у вас есть доступ к проверке диска Google:
!ls "/content/drive/My Drive"
затем скопируйте файлы (файлы) по мере необходимости:
!cp "/content/drive/My Drive/xy.py" "xy.py"
подтвердите, что файлы были скопированы:
!ls
Ответ 4
Вы не можете навсегда сохранить файл на colab. Хотя вы можете импортировать файлы с вашего диска, и каждый раз, когда вы закончите с файлом, вы можете сохранить его обратно.
Чтобы подключить Google диск к сеансу Colab
from google.colab import drive
drive.mount('/content/gdrive')
вы можете просто записать на диск Google, как и в локальную файловую систему. Теперь, если вы увидите, что ваш привод Google будет загружен на вкладке "Файлы". Теперь вы можете получить доступ к любому файлу из вашего коллажа, вы можете написать, а также прочитать его. Изменения будут сделаны в реальном времени на вашем диске, и любой, у кого есть ссылка на доступ к вашему файлу, может просматривать изменения, сделанные вами из вашего colab.
пример
with open('/content/gdrive/My Drive/filename.txt', 'w') as f:
f.write('values')
Ответ 5
Большинство предыдущих ответов немного (очень) сложно,
from google.colab import drive
drive.mount("/content/drive", force_remount=True)
Я понял, что это самый простой и быстрый способ монтировать google drive в CO Lab. Вы можете изменить расположение mount directory location
на drive.mount
просто изменив параметр для drive.mount
. Это даст вам ссылку для принятия разрешений с вашей учетной записью, а затем вам нужно будет скопировать вставить ключ, и диск будет смонтирован по выбранному пути.
force_remount
используется только тогда, когда вам необходимо смонтировать диск, независимо от того, был ли он загружен ранее. Вы можете пренебречь этим параметром когда вы не хотите принудительно монтировать диск
Изменение: проверьте это, чтобы найти больше способов выполнения операций IO
в colab https://colab.research.google.com/notebooks/io.ipynb
Ответ 6
Я ленивый и у меня плохая память, поэтому я решил создать easycolab, который легче запомнить и напечатать:
import easycolab as ec
ec.mount()
Обязательно сначала установите его !pip install easycolab
Метод mount()
основном реализует это:
from google.colab import drive
drive.mount(‘/content/drive)
cd ‘/content/gdrive/My Drive/
Ответ 7
Вы можете просто использовать фрагменты кода в левой части экрана. введите описание изображения здесь
Вставьте "Установка Google Диска в виртуальную машину"
запустите код и скопируйте и вставьте код в URL-адрес
а затем использовать! ls для проверки каталогов
!ls /gdrive
для большинства случаев вы найдете то, что хотите в каталоге "/gdrive/My drive",
то вы можете выполнить это следующим образом:
from google.colab import drive
drive.mount('/gdrive')
import glob
file_path = glob.glob("/gdrive/My Drive/***.txt")
for file in file_path:
do_something(file)
Ответ 8
@wenkesj
Я говорю о копировании каталога и всех его подкаталогов.
Для меня я нашел решение, которое выглядит так:
def copy_directory(source_id, local_target):
try:
os.makedirs(local_target)
except:
pass
file_list = drive.ListFile(
{'q': "'{source_id}' in parents".format(source_id=source_id)}).GetList()
for f in file_list:
key in ['title', 'id', 'mimeType']]))
if f["title"].startswith("."):
continue
fname = os.path.join(local_target, f['title'])
if f['mimeType'] == 'application/vnd.google-apps.folder':
copy_directory(f['id'], fname)
else:
f_ = drive.CreateFile({'id': f['id']})
f_.GetContentFile(fname)
Тем не менее, мне кажется, что gDrive не любит копировать слишком много файлов.
Ответ 9
Есть много способов прочитать файлы в вашей записной книжке colab (**. Ipnb), некоторые из них:
- Монтирование вашего Google Диска в виртуальной машине во время выполнения. здесь и здесь
- Использование google.colab.files.upload(). самое простое решение
- Использование собственного REST API;
- Использование обертки вокруг API, такого как PyDrive
Методы 1 и 2 сработали для меня, остальное я не смог понять. Если кто-то мог, как другие попробовали в посте выше, пожалуйста, напишите элегантный ответ. заранее спасибо.!
Первый метод:
Я не смог смонтировать диск Google, поэтому я установил эти библиотеки
# Install a Drive FUSE wrapper.
# https://github.com/astrada/google-drive-ocamlfuse
!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}
После завершения процесса установки и авторизации вы сначала подключаете диск.
!mkdir -p drive
!google-drive-ocamlfuse drive
После установки я смог смонтировать гугл-диск, все на вашем гугл-диске начинается с /content/drive
!ls /content/drive/ML/../../../../path_to_your_folder/
Теперь вы можете просто прочитать файл из папки path_to_your_folder
в pandas, используя вышеуказанный путь.
import pandas as pd
df = pd.read_json('drive/ML/../../../../path_to_your_folder/file.json')
df.head(5)
вы предполагаете, что используете абсолютный путь, который вы получили, а не используете /../..
Второй метод:
Что удобно, если ваш файл, который вы хотите прочитать, присутствует в текущем рабочем каталоге.
Если вам нужно загрузить какие-либо файлы из локальной файловой системы, вы можете использовать приведенный ниже код, иначе просто избегайте этого.!
from google.colab import files
uploaded = files.upload()
for fn in uploaded.keys():
print('User uploaded file "{name}" with length {length} bytes'.format(
name=fn, length=len(uploaded[fn])))
Предположим, у вас ниже иерархии папок на вашем диске Google:
/content/drive/ML/../../../../path_to_your_folder/
Затем вам просто нужен код ниже для загрузки в панд.
import pandas as pd
import io
df = pd.read_json(io.StringIO(uploaded['file.json'].decode('utf-8')))
df
Ответ 10
Я написал класс, который загружает все данные в "." расположение на сервере colab
Все это можно найти здесь https://github.com/brianmanderson/Copy-Shared-Google-to-Colab.
!pip install PyDrive
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials
import os
class download_data_from_folder(object):
def __init__(self,path):
path_id = path[path.find('id=')+3:]
self.file_list = self.get_files_in_location(path_id)
self.unwrap_data(self.file_list)
def get_files_in_location(self,folder_id):
file_list = drive.ListFile({'q': "'{}' in parents and trashed=false".format(folder_id)}).GetList()
return file_list
def unwrap_data(self,file_list,directory='.'):
for i, file in enumerate(file_list):
print(str((i + 1) / len(file_list) * 100) + '% done copying')
if file['mimeType'].find('folder') != -1:
if not os.path.exists(os.path.join(directory, file['title'])):
os.makedirs(os.path.join(directory, file['title']))
print('Copying folder ' + os.path.join(directory, file['title']))
self.unwrap_data(self.get_files_in_location(file['id']), os.path.join(directory, file['title']))
else:
if not os.path.exists(os.path.join(directory, file['title'])):
downloaded = drive.CreateFile({'id': file['id']})
downloaded.GetContentFile(os.path.join(directory, file['title']))
return None
data_path = 'shared_path_location'
download_data_from_folder(data_path)