问题很简单:我在gDrive上有一些数据,例如在
/项目/ 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)都建议只将所有必要的数据加载到笔记本中。
但是,如果我有很多数据,就会很复杂。
有没有解决这个问题的机会?
谢谢你的帮助!
@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不喜欢复制太多的文件。
我写了一个类来下载所有的数据到。’在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)
好消息,PyDrive对CoLab有一流的支持!PyDrive是谷歌Drive python客户端的包装器。下面是一个关于如何从一个文件夹下载所有文件的例子,类似于使用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())
注意驱动的参数。ListFile是一个字典,它与谷歌Drive HTTP API使用的参数相一致(您可以自定义q参数,以调优您的用例)。
要知道,在所有情况下,文件/文件夹都是通过谷歌驱动器上的id进行编码的(参见1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk)。这要求您在谷歌驱动器中搜索与您想要在其中查找的文件夹对应的特定id。
例如,导航到“/projects/my_project/my_data”文件夹
位于您的谷歌驱动器。
它包含一些文件,我们希望将这些文件下载到CoLab。要获得文件夹的id以便PyDrive使用它,请查看url并提取id参数。在本例中,文件夹对应的url为:
其中id是url的最后一部分:1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk。