PythonでGoogle ColaboratoryとGoogle Driveのファイルのやりとりする（3)

###4.queryの実行によるidの取得

下準備
説明の便宜上、Google DriveのフォルダColab Notebooks下に
from_colab, to_colabを作成し、to_colab下にgdrive.ipynbをコピーしました。(gdrive_test.ipynb)
なお、この後ファイル名やフォルダ名で検索をするので、もし同じ名前のフォルダやファイルがある場合は、違う名前のフォルダやファイルを作成してください。

<img width="334" alt="drive_disp1.png" src="https://qiita-image-store.s3.amazonaws.com/0/199023/20f82f2b-8394-aeb0-e1a8-9a3c8103aaab.png">

<img width="341" alt="drive_disp2.png" src="https://qiita-image-store.s3.amazonaws.com/0/199023/4761e586-962c-08b5-75a1-7712552c24f0.png">


下記のスクリプトを作成することでクエリが使用できます。
（リンク先のスクリプトに若干の修正を加えています。）
関数内のパラメータであるqueryにデフォルトで画像ファイルを検索するクエリ（"mimeType='image/jpeg'"）が入っているので、
gquery(service)を実行すると、Google Drive内の画像ファイルが出力されます。
また、リンク先に他のクエリのパターンについても記載されているのでご確認ください。
https://developers.google.com/drive/v3/web/search-parameters

```Python: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'を検索するクエリです。

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

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

### 5.Goole Driveからのファイルのダウンロード、アップロード
Google Driveからファイルをダウンロードする先として、フォルダtestを作成します。

```bash:mkdir
! mkdir test
```

```bash:dir
! dir
```

下記のコードにより、ダウンロードを実行します。

```python: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))
```

```python:download
gdownload(service,id1[2],'./test/')
```

下記のコマンドでダウンロードされていることを確認します。

```bash:dir/test
! dir ./test
```

このファイルを今度はGoogle Driveのfrom_colabフォルダアップロードして、
ファイルをGoogle Driveにアップロードしたファイルを確認することで、ダウンロードとアップロードが成功したことを確認します。

```python: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')
```

```python:upload
gupload(service,'./test/gdrive_test.ipynb',id2[2])
```

###6.GitHubを利用した方法
最後に、今までのコードをgutil.pyとしてGitHubにアップロードしました。
git cloneを使って、今までのコードが下記の通り実行できます。

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

```python:import
from gutil import gutil
```

```python:file_upload_dialog
import google.colab.files as ggl
fname=ggl.upload()
print(fname)
```
```python:print_name
fname = [k for k in fname.keys()][0]
print(fname)
```

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

```python:service
service = gutil.service()
```

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

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

```bash:mkdir
! mkdir test
```

```python:download
gutil.gdownload(service,id1[2],'./test/')
```
```python:upload
gutil.gupload(service,'./test/gdrive_test.ipynb',id2[2])
```