Created
January 9, 2020 19:00
-
-
Save atbradley/ee1e211864460554cbba358b780d9672 to your computer and use it in GitHub Desktop.
List and download files in Google Drive. Utility class for a data dashboard.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#Standard. | |
import io | |
#External (`pip install google-api-python-client google-auth-httplib2` should give you these.) | |
from oauth2client.service_account import ServiceAccountCredentials | |
from apiclient.discovery import build | |
from apiclient.http import MediaIoBaseDownload | |
import httplib2 | |
class Tool(): | |
def __init__(self, credfile, | |
scopes=['https://spreadsheets.google.com/feeds', | |
'https://www.googleapis.com/auth/drive']): | |
""" | |
Constructor. | |
Keyword Arguments: | |
credfile - Path to the JSON credential file for your Service Account. | |
Get this from the Google Developers Console: https://console.developers.google.com/ | |
scopes - A list of scopes required for your connection. The default | |
should be fine. | |
""" | |
credentials = ServiceAccountCredentials.from_json_keyfile_name( | |
credfile, scopes=scopes) | |
self.service = build('drive', 'v3', credentials=credentials) | |
#If this is in .service now, do I need it? | |
self.http = credentials.authorize(httplib2.Http()) | |
def listFiles(self, filetype=None, folder=None, count=100, **kwargs): | |
""" | |
List files in a Google drive. | |
Keyword Arguments: | |
type -- a MIME type. If you're looking for GSuite files, their | |
types are listed at https://developers.google.com/drive/api/v3/mime-types | |
folder -- the parent folder to search. Defaults you your entire drive. | |
count -- Number of files to return. Can range from 1 to 1000. Overrides | |
kwargs['pageSize'], if that's provided given. | |
this function doesn't handle pagination. | |
**kwargs -- additional parameters passed to the files.list API call. See | |
https://developers.google.com/drive/api/v3/reference/files/list | |
Also see https://developers.google.com/drive/api/v3/search-files | |
Returns: a list of file descriptors. Exact contents may vary based on | |
kwargs['fields']'s value. | |
""" | |
qs = [] | |
if filetype: | |
qs.append("mimeType = '%s'" % filetype) | |
if folder: | |
qs.append("'%s' in parents" % folder) | |
kwargs['pageSize'] = count | |
response = self.service.files().list(q=' and '.join(qs), | |
**kwargs).execute() | |
return response['files'] | |
def downloadGSuite(self, file_id, ftype): | |
""" | |
Download a G Suite document from Google Drive | |
Keyword Arguments: | |
file_id: Google's file id for the file. You could get it by querying the API | |
(maybe using listFiles()), or copy it from the address bar when looking at | |
the file in your browser. | |
ftype: The mime type of the export format you want. There's a list of | |
valid ones for each type of G Suite file at | |
https://developers.google.com/drive/api/v3/ref-export-formats | |
Returns: an io.BytesIO object. This is a "file-like object" you can read from. | |
""" | |
request = self.service.files().export_media(fileId=file_id, | |
mimeType=ftype) | |
fh = io.BytesIO() | |
downloader = MediaIoBaseDownload(fh, request) | |
done = False | |
while done is False: | |
status, done = downloader.next_chunk() | |
return fh |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment