구글 드라이브 파일 다운로드 파이썬 스크립트

Reading time ~1 minute

Google Drive에 있는 구글 스프레드 시트(Google Sheets)를 엑셀 파일로 다운받는 Python 스크립트이다.

대부분은 Google Drive API 공식 사이트에서 가져온 코드이며, Credential 경로를 스크립트를 실행하는 디렉토리로 변경하였고, 파일 내용을 읽기 위해 Scope를 metadata.readonly에서 readonly로 변경하였다. (Scope에 대한 자세한 정보는 여기에서 확인할 수 있다.)

Ubuntu 16.04, Python 3.5.2 환경에서 테스트하였다.

사용방법

스크립트의 인증절차를 진행하기 위해 여기에 나와있는 Step 1을 완료한다.

아래 코드에서 FILE_ID값(27번 줄)을 다운받고자 하는 파일의 실제 file id 값으로 바꿔준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#! /usr/bin/env python3

from __future__ import print_function
import httplib2
import os

from apiclient import discovery
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage

import io
from apiclient.http import MediaIoBaseDownload

try:
    import argparse
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
    flags = None

CREDENTIAL_DIR = './credentials'
CREDENTIAL_FILENAME = 'drive-python-quickstart.json'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Google Drive File Export Example'
SCOPES = 'https://www.googleapis.com/auth/drive.readonly'

FILE_ID = 'your file id'
EXCEL = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
EXPORTED_FILE_NAME = 'exported_file.xlsx'

def get_credentials():
    credential_dir = CREDENTIAL_DIR
    if not os.path.exists(credential_dir):
        os.makedirs(credential_dir)
    credential_path = os.path.join(credential_dir, CREDENTIAL_FILENAME)

    store = Storage(credential_path)
    credentials = store.get()
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
        flow.user_agent = APPLICATION_NAME
        if flags:
            credentials = tools.run_flow(flow, store, flags)
        else:
            credentials = tools.run(flow, store)
        print('Storing credentials to ' + credential_path)
    return credentials

def main():
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('drive', 'v3', http=http)

    request = service.files().export_media(fileId=FILE_ID, mimeType=EXCEL)
    fh = io.FileIO(EXPORTED_FILE_NAME, 'wb')
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print('Download %d%%.' % int(status.progress() * 100))


if __name__ == '__main__':
    main()

이 스크립트를 터미널을 통해 원격 서버에서 실행해야하는 경우에는 처음 인증을 할 때 아래와 같이 --noauth_local_webserver 옵션을 지정해서 실행해야한다.

$ ./export_example.py --noauth_local_webserver

클라이언트의 웹브라우저를 통해 인증 절차를 진행할 수 있는 URL이 표시되는데, 터미널에서 보통은 URL을 인식해서 마우스 클릭을 지원하므로 주소를 클릭해서 인증을 진행한다. 권한 요청을 허용하고나면 승인 코드가 나오는데 이 코드를 다시 터미널에 붙여넣는다.

인증이 완료되면 파일 다운로드가 진행된다.

kiwi campus

가족여행차 샌 프란시스코에 갔다가 오랜만에 버클리 교정을 구경하러 갔다.돌아다니다보니 Sather gate 근처의 분수대 주변에 이런 게 돌아다니고 있었다.처음엔 학생이 만든 장난감 정도로 생각했다. 폰에 외장(?)렌즈를 달아서 꽂아놨는데 이게 ...… Continue reading