programing

Google Colab : Google 드라이브에서 데이터를 읽는 방법은 무엇입니까?

procenter 2021. 1. 16. 10:42
반응형

Google Colab : Google 드라이브에서 데이터를 읽는 방법은 무엇입니까?


문제는 간단합니다. 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에서 최고 수준의 지원을 제공합니다! PyDrive는 Google 드라이브 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())

의 인수 drive.ListFileGoogle Drive HTTP API에서 사용하는 매개 변수와 일치하는 사전입니다 ( q사용 사례에 맞게 매개 변수를 맞춤 설정할 수 있음).

모든 경우에 파일 / 폴더는 Google 드라이브에서 id로 인코딩됩니다 ( 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk ). 이를 위해서는 검색을 루팅하려는 폴더에 해당하는 특정 ID에 대해 Google 드라이브를 검색해야합니다.

예를 들어 "/projects/my_project/my_data"Google 드라이브에 있는 폴더로 이동합니다 .

구글 드라이브

CoLab에 다운로드하려는 파일이 포함되어 있는지 확인하십시오. PyDrive에서 사용하기 위해 폴더의 ID를 얻으려면 url을보고 id 매개 변수를 추출하십시오. 이 경우 폴더에 해당하는 URL은 다음과 같습니다.

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

id는 URL의 마지막 부분 인 1SooKSw8M4ACbznKjnNrYvJ5wxuqJ-YCk 입니다.


다음 코드 스 니펫을 실행하여 Google 드라이브 파일을 마운트 할 수 있습니다.

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

그런 다음 파일 브라우저 측면 패널에서 또는 명령 줄 유틸리티를 사용하여 드라이브 파일과 상호 작용할 수 있습니다.

다음은 노트북의 예입니다.


훌륭한 답변에 감사드립니다! Google 드라이브에서 Colab으로 몇 개의 일회성 파일을 가져 오는 가장 빠른 방법 : 드라이브 도우미로드 및 마운트

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

이전 답변의 대부분은 약간 (매우) 복잡합니다.

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

나는 이것이 구글 드라이브를 CO Lab 에 마운트하는 가장 쉽고 빠른 방법이라고 생각했습니다 . mount directory location매개 변수를 변경하여 원하는대로 변경할 수 있습니다 drive.mount. 계정에 대한 권한을 수락 할 수있는 링크가 제공되며 생성 된 키를 복사하여 붙여 넣으면 선택한 경로에 드라이브가 마운트됩니다.

force_remount 이전에로드되었는지 여부에 관계없이 드라이브를 마운트해야하는 경우에만 사용됩니다. 강제 마운트를 원하지 않는 경우 매개 변수를 무시할 수 있습니다.

편집 : IOcolab https://colab.research.google.com/notebooks/io.ipynb 에서 작업 을 수행하는 더 많은 방법을 찾으려면 이것을 확인하십시오.


colab에 파일을 영구적으로 저장할 수 없습니다. 드라이브에서 파일을 가져올 수 있지만 파일 작업을 마칠 때마다 다시 저장할 수 있습니다.

Colab 세션에 Google 드라이브를 마운트하려면

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

나는 게으르고 기억력이 나쁘기 때문에 암기하고 입력하기 쉬운 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/’

화면 왼쪽에있는 코드 스 니펫을 사용하기 만하면됩니다. 여기에 이미지 설명 입력

"VM에 Google 드라이브 마운트"를 삽입합니다.

코드를 실행하고 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)

뿡뿡

나는 디렉토리와 모든 하위 디렉토리를 복사하는 것에 대해 이야기하고 있습니다.

나를 위해 다음과 같은 해결책을 찾았습니다.

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 노트북 (**. ipnb)에서 파일을 읽는 방법은 여러 가지가 있습니다.

  1. 런타임의 가상 머신에 Google 드라이브를 마운트합니다. 여기 & 여기
  2. Using google.colab.files.upload(). the easiest solution
  3. Using the native REST API;
  4. Using a wrapper around the API such as PyDrive

Method 1 and 2 worked for me, rest I wasn't able to figure out. If anyone could, as others tried in above post please write an elegant answer. thanks in advance.!

First method:

I wasn't able to mount my google drive, so I installed these libraries

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

Once the installation & authorization process is finished, you first mount your drive.

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

After installation I was able to mount the google drive, everything in your google drive starts from /content/drive

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

Now you can simply read the file from path_to_your_folder folder into pandas using the above path.

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/

그런 다음 pandas에로드하려면 아래 코드가 필요합니다.

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

모든 데이터를 '.'에 다운로드하는 클래스를 작성했습니다. 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)

참조 URL : https://stackoverflow.com/questions/48376580/google-colab-how-to-read-data-from-my-google-drive

반응형