Google Colab: จะอ่านข้อมูลจาก Google Drive ของฉันได้อย่างไร


127

ปัญหานั้นง่ายมาก: ฉันมีข้อมูลบางอย่างใน 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เป็นต้น) แนะนำให้โหลดเฉพาะข้อมูลที่จำเป็นทั้งหมดลงในโน้ตบุ๊กเท่านั้น

แต่ถ้าฉันมีข้อมูลจำนวนมากมันอาจจะค่อนข้างซับซ้อน มีโอกาสแก้ปัญหานี้หรือไม่?

ขอบคุณที่ช่วยเหลือ!


10
น่าแปลกใจ! ไม่มีใครให้ลิงก์ไปยังสมุดบันทึก colab นี้ซึ่งอธิบายถึงวิธีการทั้งหมดที่มีให้ในเดือนเมษายน 2019 - colab.research.google.com/notebooks/io.ipynb
human

คำตอบ:


64

ข่าวดีPyDrive รองรับ CoLabชั้นหนึ่งแล้ว! PyDrive เป็นเครื่องห่อสำหรับไคลเอนต์หลาม 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เป็นพจนานุกรมที่ตรงกับพารามิเตอร์ที่Google Drive HTTP API ใช้ (คุณสามารถปรับแต่งqพารามิเตอร์เพื่อปรับให้เข้ากับกรณีการใช้งานของคุณได้)

โปรดทราบว่าในทุกกรณีไฟล์ / โฟลเดอร์จะถูกเข้ารหัสโดย id (แอบดู1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk ) บน Google Drive สิ่งนี้ต้องการให้คุณค้นหา Google Drive เพื่อหารหัสเฉพาะที่ตรงกับโฟลเดอร์ที่คุณต้องการรูทการค้นหา

ตัวอย่างเช่นไปที่โฟลเดอร์"/projects/my_project/my_data"ที่อยู่ใน Google Drive ของคุณ

Google ไดรฟ์

ดูว่ามันมีไฟล์อะไรบ้างที่เราต้องการดาวน์โหลดไปยัง CoLab หากต้องการรับ id ของโฟลเดอร์เพื่อใช้โดย PyDrive ให้ดูที่ url และแยกพารามิเตอร์ id ในกรณีนี้ url ที่ตรงกับโฟลเดอร์คือ:

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

ที่ id เป็นชิ้นสุดท้ายของ URL: 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-Yck


1
ขอขอบคุณ! ได้ผลจริง! และคุณรู้วิธีคัดลอกไดเรกทอรี gDrive ทั้งหมดหรือไม่?
Scitator

@Scitator คุณหมายถึงไฟล์ทั้งหมดใน Google Drive หรือเปล่า?
wenkesj

@Scitator โปรดดูที่pythonhosted.org/PyDrive/…สำหรับคำถามของคุณ
wenkesj

1
ขอบคุณสำหรับการตอบกลับ. ได้ผล แต่อย่างใดฉันไม่เข้าใจบางอย่าง วิธีการทำงานตอนนี้ (เท่าที่ฉันเข้าใจ) คือการจัดเก็บข้อมูลในเส้นทางที่กำหนดภายใต้ "local_download_path" ที่ Google Drive! แต่ข้อมูลอยู่ใน Google ไดรฟ์แล้ว (เข้ารหัสโดยรหัสโฟลเดอร์เฉพาะ) ทำไมเราต้องทำสิ่งนี้? ฉันหมายถึงไฟล์นั้นอยู่ใน Google Drive แล้ว !! ฉันได้ลองใช้วิธีนี้ในการอ่านโฟลเดอร์ที่มีรูปภาพจำนวนมากและคอมพิวเตอร์ของฉันก็ค้าง! เมื่อฉันรันโค้ดนี้มันพยายามคัดลอกรูปภาพทั้งหมดอีกครั้ง (ที่มีอยู่แล้วใน Google Drive) ไปที่ "local_download_path" ??
TwinPenguins

1
ฉันลงเอยด้วยการตอบกลับครั้งที่สอง (ดูด้านล่าง) มันง่ายและสะดวกมาก บอกฉันว่าคุณยังมีปัญหาในการใช้คำตอบด้านล่างนี้หรือไม่
TwinPenguins

286

แก้ไข : ณ เดือนกุมภาพันธ์ 2020 ตอนนี้มี UI ระดับเฟิร์สคลาสสำหรับติดตั้งไดรฟ์โดยอัตโนมัติ

ขั้นแรกเปิดเบราว์เซอร์ไฟล์ทางด้านซ้ายมือ จะแสดงปุ่ม 'Mount Drive' เมื่อคลิกแล้วคุณจะเห็นข้อความแจ้งสิทธิ์ในการเชื่อมต่อไดรฟ์และหลังจากนั้นไฟล์ในไดรฟ์ของคุณจะปรากฏขึ้นโดยไม่มีการตั้งค่าใด ๆ เมื่อคุณกลับไปที่โน้ตบุ๊ก ขั้นตอนที่เสร็จสมบูรณ์มีลักษณะดังนี้:

ตัวอย่างการติดตั้งไดรฟ์อัตโนมัติ

คำตอบเดิมมีดังนี้ (สิ่งนี้จะยังใช้ได้กับสมุดบันทึกที่แชร์)

คุณสามารถเมานต์ไฟล์ Google ไดรฟ์ของคุณโดยเรียกใช้ข้อมูลโค้ดต่อไปนี้:

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

จากนั้นคุณสามารถโต้ตอบกับไฟล์ในไดรฟ์ของคุณในแผงด้านข้างของไฟล์เบราว์เซอร์หรือใช้ยูทิลิตี้บรรทัดคำสั่ง

นี่คือตัวอย่างสมุดบันทึก


42
เป็นวิธีแก้ปัญหาที่ตรงไปตรงมาที่สุดในการติดตั้ง gdrive ของคุณกับ google colab ฉันคิดว่าควรเป็นคำตอบที่ยอมรับ
buncis

คำตอบที่ยอมรับได้ดี สมุดบันทึกตัวอย่างเป็นแบบอ่านอย่างเดียวและไม่สามารถใช้งานได้โดยตรง การทำ File-> Save จะบันทึกไฟล์ลงในไดรฟ์
BSalita

คุณจะขึ้นไปอีกระดับได้อย่างไร? สำหรับเช่น drive.mount ('/ content / drive / name with space')
Iqlaas Ismail

คุณต้องตรวจสอบสิทธิ์ทุกครั้งที่คุณเชื่อมต่อ Google Drive ของคุณหรือไม่?
Frank Meulenaar

@FrankMeulenaar ใช่
BD

36

ขอบคุณสำหรับคำตอบที่ยอดเยี่ยม! วิธีที่เร็วที่สุดในการรับไฟล์เพียงครั้งเดียวไปยัง 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

17

คำตอบก่อนหน้านี้ส่วนใหญ่ค่อนข้างซับซ้อน (มาก)

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

ฉันคิดว่านี้จะเป็นวิธีที่ง่ายที่สุดและเร็วที่สุดในการติดตั้งไดรฟ์ของ Google ไว้ในCO Lab , คุณสามารถเปลี่ยนสิ่งที่เคยคุณต้องการโดยเพียงแค่การเปลี่ยนพารามิเตอร์สำหรับmount directory location drive.mountจะให้ลิงค์เพื่อยอมรับสิทธิ์กับบัญชีของคุณจากนั้นคุณต้องคัดลอกวางคีย์ที่สร้างขึ้นจากนั้นไดรฟ์จะถูกติดตั้งในเส้นทางที่เลือก

force_remount ใช้เฉพาะเมื่อคุณต้องติดตั้งไดรฟ์โดยไม่คำนึงว่าจะโหลดไว้ก่อนหน้านี้หรือไม่คุณสามารถละเลยสิ่งนี้ได้เมื่อพารามิเตอร์หากคุณไม่ต้องการบังคับเมานต์

แก้ไข: ตรวจสอบสิ่งนี้เพื่อค้นหาวิธีการอื่น ๆ ในIOการดำเนินการใน colab https://colab.research.google.com/notebooks/io.ipynb


14

คุณไม่สามารถจัดเก็บไฟล์บน colab ได้อย่างถาวร แม้ว่าคุณจะสามารถนำเข้าไฟล์จากไดรฟ์ของคุณและทุกครั้งเมื่อคุณทำไฟล์เสร็จแล้วคุณสามารถบันทึกกลับได้

เพื่อติดตั้ง Google Drive เข้ากับเซสชัน Colab ของคุณ

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

คุณสามารถเขียนลงใน Google ไดรฟ์ได้ตามที่คุณต้องการในระบบไฟล์ในเครื่องทันทีหากคุณเห็นไดรฟ์ Google ของคุณจะถูกโหลดในแท็บไฟล์ ตอนนี้คุณสามารถเข้าถึงไฟล์ใดก็ได้จาก colab ของคุณคุณสามารถเขียนและอ่านจากมันได้ การเปลี่ยนแปลงจะเกิดขึ้นแบบเรียลไทม์ในไดรฟ์ของคุณและทุกคนที่มีลิงก์การเข้าถึงไฟล์ของคุณสามารถดูการเปลี่ยนแปลงที่คุณทำจาก colab ของคุณ

ตัวอย่าง

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

9

สิ่งที่ฉันทำอันดับแรกคือ

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

แล้ว

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

หลังจากที่ฉันสามารถอ่านไฟล์ csv ด้วยไฟล์

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

หากคุณมีตำแหน่งที่แตกต่างกันสำหรับไฟล์ให้เพิ่มเส้นทางที่ถูกต้องหลังจากไดรฟ์ของฉัน


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 ไดรฟ์ใน VM ของคุณ"

เรียกใช้รหัสและคัดลอกและวางรหัสใน 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)

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()

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)

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

สิ่งนี้ใช้งานได้ดีสำหรับฉันในภายหลังฉันสามารถใช้osไลบรารีเพื่อเข้าถึงไฟล์ของฉันได้เช่นเดียวกับที่ฉันเข้าถึงไฟล์บนพีซีของฉัน


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. ใช้ Wrapper รอบ ๆ 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.