Google Colab:如何从我的 google 驱动器读取数据?
Google Colab: how to read data from my google drive?
问题很简单:我在 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)建议仅主要将所有必要的数据加载到笔记本中。
但是,如果我有很多数据,它可能会很复杂。
有机会解决这个问题吗?
感谢帮助!
好消息,PyDrive 在 CoLab 上首次获得 class 支持! PyDrive 是 Google Drive python 客户端的包装器。这是一个关于如何从文件夹下载 ALL 文件的示例,类似于使用 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
参数以适应您的 use-case).
知道在所有情况下,files/folders 都由 Google 驱动器上的 id(查看 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk)编码。这要求您在 Google 驱动器中搜索与您要作为搜索根目录的文件夹对应的特定 ID。
例如,导航到文件夹 "/projects/my_project/my_data"
位于您的 Google 驱动器中。
看到里面有一些文件,我们要下载到CoLab。要获取文件夹的 ID 以便 PyDrive 使用它,请查看 url 并提取 id 参数。在这种情况下,文件夹对应的 url 是:
其中id是url的最后一块:1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk.
@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 不喜欢复制太多文件。
编辑:截至 2020 年 2 月,现在第一个 class UI 用于自动安装驱动器。
首先,打开左侧的文件浏览器。它将显示一个 'Mount Drive' 按钮。单击后,您将看到安装 Drive 的权限提示,之后当您 return 到笔记本时,您的 Drive 文件将出现而无需设置。完成的流程如下所示:
原始答案如下。 (这仍然适用于共享笔记本。)
您可以通过 运行 以下代码片段装载您的 Google 驱动器文件:
from google.colab import drive
drive.mount('/content/drive')
然后,您可以在文件浏览器侧面板中或使用命令行实用程序与您的云端硬盘文件进行交互。
您可以简单地使用屏幕左侧的代码片段。
enter image description here
插入"Mounting Google Drive in your VM"
运行 代码并将代码复制并粘贴到 URL
然后使用 !ls 检查目录
!ls /gdrive
在大多数情况下,您会在目录“/gdrive/My 驱动器”
中找到您想要的内容
那么你可以这样进行:
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)
感谢您的精彩解答!
从 Google 驱动器获取一些一次性文件到 Colab 的最快方法:
加载 Drive helper 并挂载
from google.colab import drive
这将提示授权。
drive.mount('/content/drive')
在新选项卡中打开 link-> 您将获得一个代码 - 将其复制回提示符
您现在可以访问 google 驱动器
检查:
!ls "/content/drive/My Drive"
然后根据需要复制文件:
!cp "/content/drive/My Drive/xy.py" "xy.py"
确认文件已复制:
!ls
您不能在 colab 上永久存储文件。虽然您可以从驱动器导入文件,并且每次完成文件后都可以将其保存回来。
将 google 驱动器装载到您的 Colab 会话
from google.colab import drive
drive.mount('/content/gdrive')
您可以像写入本地文件系统一样简单地写入 google 驱动器
现在,如果您看到 google 驱动器将加载到“文件”选项卡中。现在您可以从您的 colab 访问任何文件,您可以写入和读取它。更改将在您的驱动器上实时完成,任何有权 link 您的文件的人都可以从您的 colab 查看您所做的更改。
例子
with open('/content/gdrive/My Drive/filename.txt', 'w') as f:
f.write('values')
读取 colab notebook(**.ipnb) 中文件的方法有很多种,其中一些是:
- 正在运行时的虚拟机中安装您的 Google 驱动器。here &, here
- 使用 google.colab.files.upload()。 the easiest solution
- 使用 native REST API;
- 在 API 周围使用包装器,例如 PyDrive
方法 1 和 2对我有用,剩下的我没弄清楚。如果有人可以,就像其他人在上面 post 中尝试的那样,请写一个优雅的答案。提前致谢!
第一种方法:
我无法安装我的 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
文件夹中的文件简单地读入 pandas。
import pandas as pd
df = pd.read_json('drive/ML/../../../../path_to_your_folder/file.json')
df.head(5)
you are suppose you use absolute path you received & not using /../..
第二种方法:
这很方便,如果您要阅读的文件存在于当前工作目录中。
如果您需要从您的本地文件系统上传任何文件,您可以使用下面的代码,否则就避免它。!
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/
然后,您只需将下面的代码加载到 pandas。
import pandas as pd
import io
df = pd.read_json(io.StringIO(uploaded['file.json'].decode('utf-8')))
df
我很懒,记性不好,所以我决定创建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/’
之前的大部分回答都有点(非常)复杂,
from google.colab import drive
drive.mount("/content/drive", force_remount=True)
我发现这是将 google 驱动器安装到 CO Lab 中的最简单和最快的方法,您只需更改参数即可将 mount directory location
更改为您想要的任何内容对于 drive.mount
。它会给你一个 link 来接受你帐户的权限,然后你必须复制粘贴生成的密钥,然后驱动器将安装在选定的路径中。
force_remount
仅在您必须挂载驱动器时使用,无论其是否已加载 previously.You 如果您不想强制挂载
可以忽略此 when 参数
编辑:查看此内容以找到在 colab https://colab.research.google.com/notebooks/io.ipynb
中执行 IO
操作的更多方法
我写了一个 class 将所有数据下载到“.” 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)
例如,要从 Google colab 笔记本中提取 Google Drive zip:
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()
读取文件夹中的所有文件:
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)
from google.colab import drive
drive.mount('/content/drive')
这对我来说很完美
我后来能够使用 os
库来访问我的文件,就像我在 PC 上访问它们一样
我首先做的是:
from google.colab import drive
drive.mount('/content/drive/')
然后
%cd /content/drive/My Drive/Colab Notebooks/
之后我可以使用
读取 csv 文件
df = pd.read_csv("data_example.csv")
如果文件的位置不同,只需在“我的云端硬盘”后添加正确的路径
考虑只下载预装 link 和 gdown
的文件,如 here
Read images from google drive using colab notebook
import glob
images_list = glob.glob("add google drive path/*.jpg")
print(images_list)
Create training.txt file, required for YOLOv4 training
file = open("/content/drive/MyDrive/project data/obj/train.txt", "w")
file.write("\n".join(images_list))
file.close()
问题很简单:我在 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)建议仅主要将所有必要的数据加载到笔记本中。
但是,如果我有很多数据,它可能会很复杂。 有机会解决这个问题吗?
感谢帮助!
好消息,PyDrive 在 CoLab 上首次获得 class 支持! PyDrive 是 Google Drive python 客户端的包装器。这是一个关于如何从文件夹下载 ALL 文件的示例,类似于使用 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
参数以适应您的 use-case).
知道在所有情况下,files/folders 都由 Google 驱动器上的 id(查看 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk)编码。这要求您在 Google 驱动器中搜索与您要作为搜索根目录的文件夹对应的特定 ID。
例如,导航到文件夹 "/projects/my_project/my_data"
位于您的 Google 驱动器中。
看到里面有一些文件,我们要下载到CoLab。要获取文件夹的 ID 以便 PyDrive 使用它,请查看 url 并提取 id 参数。在这种情况下,文件夹对应的 url 是:
其中id是url的最后一块:1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk.
@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 不喜欢复制太多文件。
编辑:截至 2020 年 2 月,现在第一个 class UI 用于自动安装驱动器。
首先,打开左侧的文件浏览器。它将显示一个 'Mount Drive' 按钮。单击后,您将看到安装 Drive 的权限提示,之后当您 return 到笔记本时,您的 Drive 文件将出现而无需设置。完成的流程如下所示:
原始答案如下。 (这仍然适用于共享笔记本。)
您可以通过 运行 以下代码片段装载您的 Google 驱动器文件:
from google.colab import drive
drive.mount('/content/drive')
然后,您可以在文件浏览器侧面板中或使用命令行实用程序与您的云端硬盘文件进行交互。
您可以简单地使用屏幕左侧的代码片段。 enter image description here
插入"Mounting Google Drive in your VM"
运行 代码并将代码复制并粘贴到 URL
然后使用 !ls 检查目录
!ls /gdrive
在大多数情况下,您会在目录“/gdrive/My 驱动器”
中找到您想要的内容那么你可以这样进行:
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)
感谢您的精彩解答! 从 Google 驱动器获取一些一次性文件到 Colab 的最快方法: 加载 Drive helper 并挂载
from google.colab import drive
这将提示授权。
drive.mount('/content/drive')
在新选项卡中打开 link-> 您将获得一个代码 - 将其复制回提示符 您现在可以访问 google 驱动器 检查:
!ls "/content/drive/My Drive"
然后根据需要复制文件:
!cp "/content/drive/My Drive/xy.py" "xy.py"
确认文件已复制:
!ls
您不能在 colab 上永久存储文件。虽然您可以从驱动器导入文件,并且每次完成文件后都可以将其保存回来。
将 google 驱动器装载到您的 Colab 会话
from google.colab import drive
drive.mount('/content/gdrive')
您可以像写入本地文件系统一样简单地写入 google 驱动器 现在,如果您看到 google 驱动器将加载到“文件”选项卡中。现在您可以从您的 colab 访问任何文件,您可以写入和读取它。更改将在您的驱动器上实时完成,任何有权 link 您的文件的人都可以从您的 colab 查看您所做的更改。
例子
with open('/content/gdrive/My Drive/filename.txt', 'w') as f:
f.write('values')
读取 colab notebook(**.ipnb) 中文件的方法有很多种,其中一些是:
- 正在运行时的虚拟机中安装您的 Google 驱动器。here &, here
- 使用 google.colab.files.upload()。 the easiest solution
- 使用 native REST API;
- 在 API 周围使用包装器,例如 PyDrive
方法 1 和 2对我有用,剩下的我没弄清楚。如果有人可以,就像其他人在上面 post 中尝试的那样,请写一个优雅的答案。提前致谢!
第一种方法:
我无法安装我的 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
文件夹中的文件简单地读入 pandas。
import pandas as pd
df = pd.read_json('drive/ML/../../../../path_to_your_folder/file.json')
df.head(5)
you are suppose you use absolute path you received & not using /../..
第二种方法:
这很方便,如果您要阅读的文件存在于当前工作目录中。
如果您需要从您的本地文件系统上传任何文件,您可以使用下面的代码,否则就避免它。!
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/
然后,您只需将下面的代码加载到 pandas。
import pandas as pd
import io
df = pd.read_json(io.StringIO(uploaded['file.json'].decode('utf-8')))
df
我很懒,记性不好,所以我决定创建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/’
之前的大部分回答都有点(非常)复杂,
from google.colab import drive
drive.mount("/content/drive", force_remount=True)
我发现这是将 google 驱动器安装到 CO Lab 中的最简单和最快的方法,您只需更改参数即可将 mount directory location
更改为您想要的任何内容对于 drive.mount
。它会给你一个 link 来接受你帐户的权限,然后你必须复制粘贴生成的密钥,然后驱动器将安装在选定的路径中。
force_remount
仅在您必须挂载驱动器时使用,无论其是否已加载 previously.You 如果您不想强制挂载
编辑:查看此内容以找到在 colab https://colab.research.google.com/notebooks/io.ipynb
中执行IO
操作的更多方法
我写了一个 class 将所有数据下载到“.” 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)
例如,要从 Google colab 笔记本中提取 Google Drive zip:
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()
读取文件夹中的所有文件:
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)
from google.colab import drive
drive.mount('/content/drive')
这对我来说很完美
我后来能够使用 os
库来访问我的文件,就像我在 PC 上访问它们一样
我首先做的是:
from google.colab import drive
drive.mount('/content/drive/')
然后
%cd /content/drive/My Drive/Colab Notebooks/
之后我可以使用
读取 csv 文件df = pd.read_csv("data_example.csv")
如果文件的位置不同,只需在“我的云端硬盘”后添加正确的路径
考虑只下载预装 link 和 gdown
的文件,如 here
Read images from google drive using colab notebook
import glob
images_list = glob.glob("add google drive path/*.jpg")
print(images_list)
Create training.txt file, required for YOLOv4 training
file = open("/content/drive/MyDrive/project data/obj/train.txt", "w")
file.write("\n".join(images_list))
file.close()