Python에서 Google 공동 작업 및 Google 드라이브 파일 상호 작용 (3)

4.query의 실행에 의한 id의 취득



아래 준비
설명의 편의를 위해 Google 드라이브 폴더 Colab Notebooks 아래
from_colab, to_colab를 만들고 to_colab 아래에 gdrive.ipynb를 복사했습니다. (gdrive_test.ipynb)
덧붙여 이 후 파일명이나 폴더명으로 검색을 하므로, 같은 이름의 폴더나 파일이 있는 경우는, 다른 이름의 폴더나 파일을 작성해 주세요.





아래 스크립트를 작성하여 쿼리를 사용할 수 있습니다.
(링크 대상 스크립트에 약간의 수정을 추가하고 있습니다.)
함수의 파라미터인 query에 디폴트로 이미지 파일을 검색하는 쿼리("mimeType='image/jpeg'")가 들어 있으므로,
gquery(service)를 실행하면 Google Drive의 이미지 파일이 출력됩니다.
또한 링크 대상에 다른 쿼리의 패턴에 대해서도 기재되어 있으므로 확인하시기 바랍니다.
htps : //에서 ゔぇぺぺrs. 오, ぇ. 코 m / d 리 ゔ / v3 / u b / 음 rch 파라 rs

gquery
def gquery(service,query="mimeType='image/jpeg'"):
    page_token = None
    gquery=[]
    cnt=0
    while True:
        response = service.files().list(q=query,spaces='drive',fields='nextPageToken, \
        files(id, name)',pageToken=page_token).execute()
        for file in response.get('files', []):
            # Process change
            print ('Found file: %s (%s)' % (file.get('name'), file.get('id')))
            gquery.append([cnt,file.get('name'), file.get('id')]) 
            cnt=cnt+1
        page_token = response.get('nextPageToken', None)
        if page_token is None:
            break
    return gquery

gdrive_test.ipynb의 id를 얻고 싶으므로 아래 코드를 사용하여
파일의 id를 가져옵니다. id1[2]가 다운로드하는 파일 'gdrive_test.ipynb', id2[2]가 업로드할 폴더 'from_colab'을 검색하는 쿼리입니다.

print_id1
id1=gquery(service,"name='gdrive_test.ipynb'")[0]
print(id1)
print("id1 is following:")
print(id1[2])

print_id2
id2=gquery(service,"name='from_colab'")[0]
print(id2)
print("id2 is following:")
print(id2[2])

5.Goole Drive에서 파일 다운로드, 업로드



Google Drive에서 파일을 다운로드할 대상으로 폴더 test를 만듭니다.

mkdir
! mkdir test

dir
! dir

아래 코드로 다운로드를 실행합니다.

gdownload
import io
from apiclient.http import MediaIoBaseDownload
def gdownload(service,id,path='./'):    
    fname=service.files().get(fileId=id).execute()["name"]
    request = service.files().get_media(fileId=id)
    fh = io.FileIO(path+fname,'wb')
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print ("Download %d%%." % int(status.progress() * 100))

다운로드
gdownload(service,id1[2],'./test/')

아래 명령으로 다운로드되었는지 확인합니다.

dir/test
! dir ./test

이 파일을 Google Drive의 from_colab 폴더로 업로드하고,
파일을 Google 드라이브에 업로드한 파일을 검토하여 다운로드 및 업로드가 성공했는지 확인합니다.

gupload
import os
from apiclient.http import MediaFileUpload
#file upload
def gupload(service,filepath,id=[]):
    file_metadata = {'name': os.path.basename(filepath),'parents':[id]}
    media_body = MediaFileUpload(filepath,chunksize=1024*1024, resumable=True)
    file = service.files().create(body=file_metadata,media_body=media_body).execute()
    print('done')

업로드
gupload(service,'./test/gdrive_test.ipynb',id2[2])

6.GitHub를 이용한 방법



마지막으로 이전 코드를 gutil.py로 GitHub에 업로드했습니다.
git clone을 사용하여 지금까지의 코드를 다음과 같이 실행할 수 있습니다.

git_clone
! git clone https://github.com/hrnckmr/gutil

import
from gutil import gutil

file_upload_dialog
import google.colab.files as ggl
fname=ggl.upload()
print(fname)

print_name
fname = [k for k in fname.keys()][0]
print(fname)

change_the_json_name
import os
os.rename(fname,'client_secret.json')

서비스
service = gutil.service()

query1
id1=gutil.gquery(service,"name='gdrive_test.ipynb'")[0]
print(id1)
print("id1 is following:")
print(id1[2])

query2
id2=gutil.gquery(service,"name='from_colab'")[0]
print(id2)
print("id2 is following:")
print(id2[2])

mkdir
! mkdir test

다운로드
gutil.gdownload(service,id1[2],'./test/')

업로드
gutil.gupload(service,'./test/gdrive_test.ipynb',id2[2])

좋은 웹페이지 즐겨찾기