Google Colab: как читать данные с моего диска Google?


114

Проблема проста: у меня есть данные о 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 ) предлагается в основном загружать в блокнот только все необходимые данные.

Но если у меня много данных, это может быть довольно сложно. Есть ли возможности решить этот вопрос?

Спасибо за помощь!


9
Удивительно! никто не дал ссылку на этот блокнот colab, в котором описаны все методы, доступные по состоянию на апрель 2019 г. - colab.research.google.com/notebooks/io.ipynb
human

Ответы:


61

Хорошие новости, 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- это словарь, который совпадает с параметрами, используемыми Google Drive HTTP API (вы можете настроить qпараметр, чтобы он соответствовал вашему варианту использования).

Знайте, что во всех случаях файлы / папки кодируются по идентификаторам ( посмотрите 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk ) на Google Диске. Это требует, чтобы вы выполняли поиск на Google Диске по конкретному идентификатору, соответствующему папке, в которой вы хотите выполнить поиск.

Например, перейдите в папку, "/projects/my_project/my_data"которая находится на вашем Google Диске.

Гугл драйв

Видим, что он содержит файлы, которые мы хотим загрузить в CoLab. Чтобы получить идентификатор папки для использования PyDrive, посмотрите на URL-адрес и извлеките параметр id. В этом случае URL-адрес, соответствующий папке, был:

https://drive.google.com/drive/folders/1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk

Где id - это последняя часть URL -адреса : 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk .


1
Спасибо! Это действительно работает! И знаете ли вы какие-либо решения для копирования всего каталога gDrive?
Scitator

@Scitator, вы имеете в виду все файлы на Google Диске?
wenkesj

@Scitator, пожалуйста, посмотрите на pythonhosted.org/PyDrive/… для ответа на свой вопрос
wenkesj

1
Спасибо за ответ. Работает, но как-то я чего-то не понимаю. Как он работает сейчас (насколько я понимаю), он хранит данные по заданному пути в "local_download_path" на Google Диске! Но данные уже находятся на Google Диске (закодированы с помощью определенного идентификатора папки). Зачем нам это нужно? Я имею в виду, что файл / файлы уже находятся на Google Диске !! Я пробовал этот метод для чтения папки, содержащей много изображений, и мой компьютер завис! Когда я запускал этот код, он на самом деле пытался СНОВА скопировать все изображения (которые уже находятся на Google Диске) в "local_download_path" ??
TwinPenguins

1
Что ж, в итоге я использовал второй ответ (см. Ниже). Это супер просто и легко. Скажите, если у вас все еще есть проблема, используя приведенные ниже ответы.
TwinPenguins

266

Изменить : по состоянию на февраль 2020 года появился первоклассный пользовательский интерфейс для автоматического подключения Drive.

Сначала откройте браузер файлов с левой стороны. Появится кнопка «Смонтировать диск». После нажатия вы увидите запрос о разрешениях для подключения Диска, а после этого ваши файлы Диска будут присутствовать без настройки, когда вы вернетесь в ноутбук. Завершенный поток выглядит так:

Пример автоматического монтирования диска

Исходный ответ следует ниже. (Это также будет работать для общих записных книжек.)

Вы можете смонтировать файлы на Google Диске, запустив следующий фрагмент кода:

from google.colab import drive
drive.mount('/content/drive')

Затем вы можете взаимодействовать с файлами на Диске на боковой панели браузера файлов или с помощью утилит командной строки.

Вот пример блокнота


39
это наиболее простое решение для установки вашего gdrive в google colab, я думаю, это должен быть принятый ответ
buncis

Канонический ответ, приятно. Пример записной книжки предназначен только для чтения и не может использоваться напрямую. Выполнение File-> Save сохранит файл на диск.
BSalita

Как перейти на другой уровень? например, для drive.mount ('/ content / drive / name with space')
Иклаас Исмаил

Вам нужно проходить аутентификацию каждый раз, когда вы подключаете свой Google диск?
Франк Мёленаар

@FrankMeulenaar да
DB

32

Спасибо за отличные ответы! Самый быстрый способ получить несколько разовых файлов в Colab с диска Google: загрузить помощник по Диску и смонтировать

from google.colab import drive

Появится запрос на авторизацию.

drive.mount('/content/drive')

Откройте ссылку в новой вкладке-> вы получите код - скопируйте его обратно в подсказку, теперь у вас есть доступ к проверке диска Google:

!ls "/content/drive/My Drive"

затем скопируйте файл (ы) по мере необходимости:

!cp "/content/drive/My Drive/xy.py" "xy.py"

подтверждаем, что файлы были скопированы:

!ls

можно ли смонтировать только определенный каталог на моем диске в colab?
Gowtham M

Боюсь, что в настоящее время это невозможно
Химаншу

16

Большинство предыдущих ответов немного (очень) сложны,

from google.colab import drive
drive.mount("/content/drive", force_remount=True)

Я понял, что это самый простой и быстрый способ установить диск Google в CO Lab. Вы можете изменить его mount directory locationна все, что захотите, просто изменив параметр для drive.mount. Он даст вам ссылку для принятия разрешений с вашей учетной записью, а затем вам нужно скопировать и вставить сгенерированный ключ, а затем диск будет установлен по выбранному пути.

force_remount используется только тогда, когда вам нужно смонтировать диск, независимо от того, был ли он загружен ранее. Вы можете пренебречь этим параметром when, если не хотите принудительно монтировать

Изменить: проверьте это, чтобы узнать больше о способах выполнения IOопераций в colab https://colab.research.google.com/notebooks/io.ipynb


13

Вы не можете постоянно хранить файл на 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')

7

Сначала я сделал следующее:

from google.colab import drive
drive.mount('/content/drive/')

затем

%cd /content/drive/My Drive/Colab Notebooks/

После того, как я могу, например, читать файлы csv с помощью

df = pd.read_csv("data_example.csv")

Если у вас разные места для файлов, просто добавьте правильный путь после My Drive


5

Я ленив и у меня плохая память, поэтому я решил создать 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/’

2

Вы можете просто использовать фрагменты кода в левой части экрана. введите описание изображения здесь

Вставьте «Монтирование Google Диска в ВМ»

запустите код и скопируйте и вставьте код в URL-адрес

а затем используйте! ls для проверки каталогов

!ls /gdrive

в большинстве случаев вы найдете то, что хотите, в каталоге "/ gdrive / Мой диск"

тогда вы можете выполнить это так:

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)

1

Я написал класс, который загружает все данные в каталог. расположение на сервере 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)

1

Чтобы извлечь zip-файл Google Диска из записной книжки Google Colab, например:

import zipfile
from google.colab import drive

drive.mount('/content/drive/')

zip_ref = zipfile.ZipFile("/content/drive/My Drive/ML/DataSet.zip", 'r')
zip_ref.extractall("/tmp")
zip_ref.close()

1

Чтобы прочитать все файлы в папке:

import glob
from google.colab import drive
drive.mount('/gdrive', force_remount=True)

#!ls "/gdrive/My Drive/folder"

files = glob.glob(f"/gdrive/My Drive/folder/*.txt")
for file in files:  
  do_something(file)

0

@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 не любит копировать слишком много файлов.


0

Есть много способов прочитать файлы в записной книжке colab (**. Ipnb), некоторые из них:

  1. Монтирование вашего Google Диска в виртуальной машине среды выполнения. здесь и здесь
  2. Использование google.colab.files.upload (). самое простое решение
  3. Использование собственного REST API ;
  4. Использование оболочки вокруг 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

После установки мне удалось смонтировать диск Google, все на вашем диске Google начинается с / 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/

Затем вам просто нужен приведенный ниже код для загрузки в pandas.

import pandas as pd
import io
df = pd.read_json(io.StringIO(uploaded['file.json'].decode('utf-8')))
df

0
from google.colab import drive
drive.mount('/content/drive')

Это сработало идеально для меня, позже я смог использовать osбиблиотеку для доступа к своим файлам точно так же, как я получаю к ним доступ на своем ПК.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.