问题很简单:我在 gDrive 上有一些数据,例如在 /projects/my_project/my_data*.
/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)都建议仅主要将所有必要的数据加载到笔记本中。
但是,如果我有很多数据,它可能会非常复杂。有没有机会解决这个问题?
感谢帮助!
好消息,PyDrive在 CoLab 上有一流的支持!PyDrive 是 Google Drive python 客户端的包装器。这是一个有关如何从文件夹下载 所有 文件的示例,类似于使用glob+ *:
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())
请注意,参数 to是与Google Drive HTTP APIdrive.ListFile使用的参数一致的字典(您可以自定义参数以适应您的用例)。q
drive.ListFile
q
知道在所有情况下,文件/文件夹都由 Google Drive 上的 id 编码(窥视 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ- YCk )。这要求您在 Google 云端硬盘中搜索与您要在其中进行搜索的文件夹相对应的特定 ID。
例如,导航到"/projects/my_project/my_data"位于您的 Google Drive 中的文件夹。
"/projects/my_project/my_data"
看到它包含一些文件,我们要在其中下载到 CoLab。要获取文件夹的 id 以便 PyDrive 使用它,请查看 url 并提取 id 参数。在这种情况下,与文件夹对应的 url 是:
其中 id 是 url 的最后一段: 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk 。