Google Colab: як читати дані з мого диска Google?


113

Проблема проста: у мене є деякі дані про 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
людина

Відповіді:


60

Хороші новини, PyDrive має першокласну підтримку CoLab! PyDrive - це оболонка для клієнта python Google Drive. Ось приклад того, як ви завантажували ВСІ файли з папки, подібно до використання 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- це словник, який збігається з параметрами, що використовуються HTTP API Google Drive (ви можете налаштувати qпараметр відповідно до вашого випадку використання).

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

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

Google Drive

Переконайтеся, що він містить деякі файли, які ми хочемо завантажити до CoLab. Щоб отримати ідентифікатор папки, щоб використовувати його за допомогою PyDrive, перегляньте URL-адресу та витягніть параметр id. У цьому випадку URL-адреса, що відповідає папці:

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

Де ідентифікатор - остання частина URL-адреси: 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk .


1
Дякую! Це справді працює! А чи знаєте ви якісь рішення для копіювання цілого каталогу gDrive?
Scitator

@Scitator, ти маєш на увазі всі файли в Google Drive?
wenkesj

@Scitator, будь ласка, загляньте на pythonhosted.org/PyDrive/… для вашого запитання
wenkesj,

1
Дякую за відповідь. Це працює, але якось я чогось не розумію. Зараз це працює (наскільки я розумію), що він зберігає дані за вказаним шляхом у розділі "local_download_path" на Google Drive! Але дані вже є на Google Drive (закодовані певним ідентифікатором папки). Навіщо нам це робити? Я маю на увазі, що файл / файли вже є в Google Drive !! Я спробував цей метод для читання папки, що містить безліч зображень, і мій комп’ютер завмер! Коли я запустив цей код, він фактично спробував ЗНОВУ скопіювати всі зображення (що вже є на Google Drive) у "local_download_path" ??
TwinPenguins

1
Ну, в підсумку я використав другу відповідь (див. Нижче). Це надзвичайно просто і просто. Скажіть, якщо у вас все ще виникають проблеми з використанням наведених нижче відповідей.
TwinPenguins

251

Редагувати : станом на лютий 2020 року тепер існує першокласний інтерфейс для автоматичного монтажу Drive.

Спочатку відкрийте браузер файлів зліва. На ньому з'явиться кнопка "Mount Drive". Після натискання ви побачите запит на отримання дозволу на підключення Диска, а потім ваші файли на Диску будуть відсутні, без налаштування, коли ви повернетеся до блокнота. Завершений потік виглядає так:

Приклад автоматичного кріплення приводу

Оригінальна відповідь наведена нижче. (Це також все одно працюватиме для спільних блокнотів.)

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

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

Потім ви можете взаємодіяти з файлами на Диску на бічній панелі браузера файлів або за допомогою утиліт командного рядка.

Ось приклад зошита


36
це найбільш пряме рішення для підключення вашого gdrive до google colab, я думаю, це має бути прийнятою відповіддю
buncis

Канонічна відповідь, приємно. Приклад зошита призначений лише для читання і не може використовуватися безпосередньо. Виконання Файл-> Зберегти збереже файл на диску.
BSalita

Як ви піднімаєтесь на інший рівень? наприклад, drive.mount ('/ content / drive / name with space')
Iqlaas Ismail

Чи потрібно проводити автентифікацію кожного разу, коли ви підключаєте свій google-диск?
Френк Меуленар

@FrankMeulenaar так
DB

31

Дякуємо за чудові відповіді! Найшвидший спосіб отримати кілька одноразових файлів до 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,

Я боюся , що це в нині не видається можливим
Himanshu Poddar

16

Більшість попередніх відповідей трохи (Дуже) складні,

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

Я зрозумів, що це найпростіший і найшвидший спосіб встановити google drive в лабораторію CO. Ви можете змінити його mount directory locationна будь-який, що хочете, просто змінивши параметр для drive.mount. Він дасть вам посилання, щоб прийняти дозволи з вашим обліковим записом, а потім вам доведеться скопіювати вставити згенерований ключ, і тоді диск буде змонтований у вибраному шляху.

force_remount використовується лише тоді, коли вам потрібно встановити привід незалежно від того, завантажений він раніше. Ви можете нехтувати цим параметром, якщо не хочете примусово монтувати

Редагувати: IOознайомтеся з цим, щоб знайти більше способів здійснення операцій у colab https://colab.research.google.com/notebooks/io.ipynb


13

Ви не можете постійно зберігати файл на colab. Хоча ви можете імпортувати файли з вашого диска, і кожен раз, коли закінчите з файлом, ви можете зберегти його назад.

Щоб підключити привід google до сеансу Colab

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

ви можете просто написати на google drive, як це зробили б у локальну файлову систему. Якщо ви бачите, ваш google drive буде завантажений на вкладку Файли. Тепер ви можете отримати доступ до будь-якого файлу зі своєї colab, можете писати, а також читати з нього. Зміни будуть виконуватися в режимі реального часу на вашому диску, і кожен, хто має посилання на доступ до вашого файлу, може переглядати внесені вами зміни з вашої колаборації.

Приклад

with open('/content/gdrive/My Drive/filename.txt', 'w') as f:
   f.write('values')

4

Я лінивий, і пам’ять у мене погана, тому я вирішив створити 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 Drive у вашу віртуальну машину"

запустіть код і скопіюйте та вставте код в 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)

2

Що я зробив, це спочатку:

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

Тоді

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

Після того, як я можу, наприклад, читати csv-файли за допомогою

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

Якщо у вас різні місця розташування файлів, просто додайте правильний шлях після Мого диска


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 Drive із блокнота 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()

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 Drive у віртуальну машину середовища виконання. тут &, тут
  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папки в панди, використовуючи вищевказаний шлях.

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

0

Щоб прочитати всі файли в папці:

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
from google.colab import drive
drive.mount('/content/drive')

Це мені вдалося, я пізніше зміг скористатися osбібліотекою для доступу до своїх файлів так само, як і доступ до них на своєму ПК


0

Подумайте про те, щоб просто завантажити файл із постійним посиланням та gdownпопередньо встановленим, як тут

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.