Google Colab: làm thế nào để đọc dữ liệu từ ổ đĩa google của tôi?


113

Vấn đề rất đơn giản: Tôi có một số dữ liệu trên gDrive, chẳng hạn tại /projects/my_project/my_data*.

Ngoài ra, tôi có một sổ ghi chép đơn giản trong gColab.

Vì vậy, tôi muốn làm điều gì đó như:

for file in glob.glob("/projects/my_project/my_data*"):
    do_something(file)

Thật không may, tất cả các ví dụ (như thế này - https://colab.research.google.com/notebook#fileId=/v2/external/notebooks/io.ipynb chẳng hạn) đề xuất chỉ chủ yếu tải tất cả dữ liệu cần thiết vào sổ ghi chép.

Nhưng, nếu tôi có nhiều dữ liệu, nó có thể khá phức tạp. Có cơ hội nào để giải quyết vấn đề này không?

Cảm ơn vì sự giúp đỡ!


9
Thật ngạc nhiên! không ai cung cấp liên kết đến sổ ghi chép colab này mô tả tất cả các phương pháp có sẵn kể từ tháng 4 năm 2019 - colab.research.google.com/notebooks/io.ipynb
human

Câu trả lời:


60

Tin vui, PyDrive có hỗ trợ hạng nhất trên CoLab! PyDrive là một trình bao bọc cho ứng dụng python Google Drive. Dưới đây là một ví dụ về cách bạn tải xuống TẤT CẢ các tệp từ một thư mục, tương tự như sử dụng 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())

Lưu ý rằng các đối số đến drive.ListFilelà một từ điển trùng với các tham số được sử dụng bởi API HTTP của Google Drive (bạn có thể tùy chỉnh qtham số được điều chỉnh theo trường hợp sử dụng của mình).

Biết rằng trong mọi trường hợp, các tệp / thư mục được mã hóa bằng id (nhìn trộm 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk ) trên Google Drive. Điều này yêu cầu bạn tìm kiếm trên Google Drive để tìm id cụ thể tương ứng với thư mục bạn muốn root tìm kiếm của mình.

Ví dụ: điều hướng đến thư mục "/projects/my_project/my_data"nằm trong Google Drive của bạn.

Google Drive

Thấy rằng nó chứa một số tệp mà chúng tôi muốn tải xuống CoLab. Để lấy id của thư mục nhằm sử dụng nó bởi PyDrive, hãy xem url và trích xuất tham số id. Trong trường hợp này, url tương ứng với thư mục là:

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

Trong đó id là phần cuối cùng của url: 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk .


1
Cảm ơn bạn! Nó thật sự có hiệu quả! Và bạn có biết giải pháp nào để sao chép toàn bộ thư mục gDrive không?
Scitator

@Scitator có nghĩa là tất cả các tệp trong Google Drive?
wenkesj

@Scitator vui lòng xem qua pythonhosted.org/PyDrive/… cho câu hỏi của bạn
wenkesj

1
Cảm ơn vi đa trả lơi. Nó hoạt động, nhưng bằng cách nào đó tôi không hiểu điều gì đó. Cách nó đang hoạt động bây giờ (theo như tôi hiểu) là nó lưu trữ dữ liệu tại đường dẫn nhất định trong "local_download_path" tại Google Drive! Nhưng dữ liệu đã có trong Google Drive (được mã hóa bởi một id thư mục cụ thể). Tại sao chúng ta cần làm điều này? Ý tôi là tệp / tệp đã có trong Google Drive !! Tôi đã thử phương pháp này để đọc một thư mục chứa nhiều hình ảnh và máy tính của tôi bị treo! Khi tôi chạy mã này, nó thực sự cố sao chép LẠI tất cả hình ảnh (đã có trong Google Drive) sang "local_download_path" ??
TwinPenguins

1
Chà, tôi đã sử dụng câu trả lời thứ hai (xem bên dưới). Nó là siêu đơn giản và dễ dàng. Hãy cho tôi biết nếu bạn vẫn gặp sự cố khi sử dụng các câu trả lời bên dưới.
TwinPenguins

252

Chỉnh sửa : Kể từ tháng 2 năm 2020, hiện đã có giao diện người dùng hạng nhất để tự động gắn Drive.

Đầu tiên, mở trình duyệt tệp ở phía bên tay trái. Nó sẽ hiển thị nút 'Mount Drive'. Sau khi nhấp, bạn sẽ thấy lời nhắc cấp quyền để gắn kết Drive và sau đó, các tệp Drive của bạn sẽ hiển thị mà không cần thiết lập khi bạn quay lại sổ ghi chép. Luồng đã hoàn thành trông giống như sau:

Ví dụ về Drive auto mount

Câu trả lời ban đầu sau đây, bên dưới. (Điều này cũng sẽ vẫn hoạt động đối với sổ ghi chép dùng chung.)

Bạn có thể gắn kết các tệp Google Drive của mình bằng cách chạy đoạn mã sau:

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

Sau đó, bạn có thể tương tác với các tệp Drive của mình trong bảng điều khiển bên của trình duyệt tệp hoặc sử dụng các tiện ích dòng lệnh.

Đây là một sổ tay mẫu


36
đó là giải pháp thẳng thắn nhất để gắn gdrive của bạn với google colab, tôi nghĩ rằng đó phải là câu trả lời được chấp nhận
buncis 18/09/18

Câu trả lời chính tắc, tốt đẹp. Sổ ghi chép ví dụ ở chế độ chỉ đọc và không thể sử dụng trực tiếp. Thực hiện File-> Save sẽ lưu một tệp vào ổ đĩa.
BSalita

Làm thế nào để bạn lên một cấp độ khác? ví dụ. drive.mount ('/ content / drive / name with space')
Iqlaas Ismail

Bạn có phải xác thực mỗi khi bạn kết nối ổ đĩa google của mình không?
Frank Meulenaar

@FrankMeulenaar vâng
DB

31

Cảm ơn vì những câu trả lời tuyệt vời! Cách nhanh nhất để tải một vài tệp một lần sang Colab từ Google drive: Tải trình trợ giúp Drive và gắn kết

from google.colab import drive

Điều này sẽ nhắc bạn cho phép.

drive.mount('/content/drive')

Mở liên kết trong một tab mới-> bạn sẽ nhận được một mã - hãy sao chép lại mã đó vào lời nhắc bây giờ bạn có quyền truy cập vào google drive check:

!ls "/content/drive/My Drive"

sau đó sao chép (các) tệp nếu cần:

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

xác nhận rằng các tệp đã được sao chép:

!ls

có thể chỉ gắn thư mục cụ thể trong ổ đĩa của tôi vào colab không?
Gowtham M

Tôi sợ rằng hiện tại không thể
Himanshu Poddar

16

Hầu hết các câu trả lời trước đây hơi (Rất) phức tạp,

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

Tôi đã tìm ra đây là cách dễ nhất và nhanh nhất để gắn google drive vào CO Lab , Bạn có thể thay đổi mount directory locationthành những gì bạn muốn chỉ bằng cách thay đổi tham số drive.mount. Nó sẽ cung cấp cho bạn một liên kết để chấp nhận các quyền với tài khoản của bạn và sau đó bạn phải sao chép, dán khóa được tạo và sau đó ổ đĩa sẽ được gắn vào đường dẫn đã chọn.

force_remount chỉ được sử dụng khi bạn phải gắn ổ đĩa bất kể nó đã được tải trước đó hay chưa. Bạn có thể bỏ qua thông số này khi nếu bạn không muốn buộc gắn kết

Chỉnh sửa: Kiểm tra phần này để tìm thêm các cách thực hiện các IOthao tác trong colab https://colab.research.google.com/notebooks/io.ipynb


13

Bạn không thể lưu trữ vĩnh viễn một tệp trên colab. Mặc dù bạn có thể nhập tệp từ ổ đĩa của mình và bất cứ khi nào bạn làm xong tệp, bạn có thể lưu lại.

Để gắn google drive vào phiên Colab của bạn

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

bạn có thể chỉ cần ghi vào google drive như bạn làm vào hệ thống tệp cục bộ Bây giờ nếu bạn thấy ổ đĩa google của bạn sẽ được tải trong tab Tệp. Bây giờ bạn có thể truy cập bất kỳ tệp nào từ cột của mình, bạn có thể viết cũng như đọc từ nó. Các thay đổi sẽ được thực hiện theo thời gian thực trên ổ đĩa của bạn và bất kỳ ai có liên kết truy cập vào tệp của bạn đều có thể xem các thay đổi do bạn thực hiện từ chuyên mục của bạn.

Thí dụ

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

4

Tôi lười biếng và trí nhớ kém, vì vậy tôi quyết định tạo easycolab dễ ghi nhớ và nhập liệu hơn:

import easycolab as ec
ec.mount()

Đảm bảo cài đặt nó trước: !pip install easycolab

Các mount()phương pháp cơ bản thực hiện điều này:

from google.colab import drive
drive.mount(‘/content/drive’)
cd ‘/content/gdrive/My Drive/’

2

Bạn chỉ cần sử dụng các đoạn mã ở bên trái màn hình. nhập mô tả hình ảnh ở đây

Chèn "Gắn Google Drive vào máy ảo của bạn"

chạy mã và sao chép & dán mã vào URL

và sau đó sử dụng! ls để kiểm tra các thư mục

!ls /gdrive

đối với hầu hết các trường hợp, bạn sẽ tìm thấy thứ mình muốn trong thư mục "/ gdrive / My drive"

thì bạn có thể thực hiện nó như thế này:

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

Những gì tôi đã làm trước tiên là:

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

Sau đó

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

Ví dụ sau khi tôi có thể đọc tệp csv với

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

Nếu bạn có các vị trí khác nhau cho các tệp, chỉ cần thêm đường dẫn chính xác sau Drive của tôi


1

Tôi đã viết một lớp tải tất cả dữ liệu xuống '.' vị trí trong máy chủ colab

Toàn bộ nội dung có thể được lấy từ đây 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

Để giải nén tệp zip Google Drive từ sổ ghi chép chuyên mục của Google, ví dụ:

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

Tôi đang nói về sao chép thư mục và tất cả các thư mục con của nó.

Đối với tôi, tôi đã tìm thấy một giải pháp, trông như thế này:

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)

Tuy nhiên, có vẻ như gDrive không thích sao chép quá nhiều tệp.


0

Có nhiều cách để đọc các tệp trong sổ ghi chép colab của bạn (**. Ipnb), một số cách là:

  1. Gắn Google Drive của bạn vào máy ảo của thời gian chạy. đây &, đây
  2. Sử dụng google.colab.files.upload (). giải pháp đơn giản nhất
  3. Sử dụng API REST gốc ;
  4. Sử dụng trình bao bọc xung quanh API chẳng hạn như PyDrive

Phương pháp 1 và 2 có hiệu quả với tôi , phần còn lại tôi không thể tìm ra. Nếu bất cứ ai có thể, như những người khác đã cố gắng trong bài đăng trên, vui lòng viết một câu trả lời thanh lịch. cảm ơn trước.!

Phương pháp đầu tiên:

Tôi không thể gắn ổ đĩa google của mình, vì vậy tôi đã cài đặt các thư viện này

# 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}

Sau khi quá trình cài đặt & ủy quyền hoàn tất, trước tiên bạn gắn ổ đĩa của mình.

!mkdir -p drive
!google-drive-ocamlfuse drive

Sau khi cài đặt, tôi đã có thể mount google drive, mọi thứ trong google drive của bạn đều bắt đầu từ / content / drive

!ls /content/drive/ML/../../../../path_to_your_folder/

Bây giờ bạn có thể chỉ cần đọc tệp từ path_to_your_folderthư mục vào gấu trúc bằng đường dẫn trên.

import pandas as pd
df = pd.read_json('drive/ML/../../../../path_to_your_folder/file.json')
df.head(5)

bạn giả sử bạn sử dụng đường dẫn tuyệt đối mà bạn đã nhận được và không sử dụng /../ ..

Phương pháp thứ hai :

Điều này thật tiện lợi, nếu tệp của bạn mà bạn muốn đọc có trong thư mục làm việc hiện tại.

Nếu bạn cần tải lên bất kỳ tệp nào từ hệ thống tệp cục bộ của mình, bạn có thể sử dụng mã bên dưới, nếu không, chỉ cần tránh nó.!

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

giả sử bạn có bên dưới phân cấp thư mục trong google drive của mình:

/content/drive/ML/../../../../path_to_your_folder/

Sau đó, bạn chỉ cần mã bên dưới để tải vào gấu trúc.

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

0

Để đọc tất cả các tệp trong một thư mục:

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

Điều này hoàn toàn phù hợp với tôi, sau này tôi có thể sử dụng osthư viện để truy cập các tệp của mình giống như cách tôi truy cập chúng trên PC của mình


0

Hãy xem xét chỉ tải xuống tệp với liên kết vĩnh viễn và gdownđược cài đặt sẵn như tại đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.