from gapi.api import API import re APPLICATION_NAME = "Google Calendar API Python" def is_folder(element): return element['mimeType'] == 'application/vnd.google-apps.folder' def split_path(path,rev=False): s = re.findall(r'(?:^/|[^/\x00]+)',path) if rev: return s[::-1] else: return s class drive_api(API): def __init__( self, app_name, client_secret_file, credentials_dir, scopes = 'https://www.googleapis.com/auth/drive', version = 'v3', ): super().__init__('drive',scopes,app_name,client_secret_file,credentials_dir,version) self.filesystem = {'/':{}} root_meta = self.service.files().get(fileId='root').execute() del root_meta['kind'] self.filesystem['/'][0] = root_meta def get_file_by_path(self,path): path = split_path(path) parent = self.filesystem for sub in path[:-1]: try: parent = parent[sub] except KeyError: self.fill_in(parent) parent = parent[sub] end = path[-1] for _try in range(2): try: return parent[end] except KeyError: if _try == 0: self.fill_in(parent) else: raise FileNotFoundError() # finds all files and folders from a parent def fill_in(self,parent): parent_id = parent[0]['id'] child_list = self.list_children(parent_id) for child in child_list: del child['kind'] name = child.pop('name') if is_folder(child): parent[name] = {} parent[name][0] = child else: parent[name] = child def list_children(self,parent_id): page_token = None first = True while page_token or first: first = False response = self.service.files().list(q = "'{}' in parents".format(parent_id),pageToken=page_token).execute() page_token = response.get('nextPageToken',None) for file in response['files']: yield file if __name__ == "__main__": my_api = drive_api(APPLICATION_NAME,r'..\test\drive\client_secret.json',r'..\test\drive') service = my_api.service