Python Google Drive API - list the entire drive file tree

前端 未结 4 1692
走了就别回头了
走了就别回头了 2020-12-10 06:02

I\'m building a python application that uses the Google drive APIs, so fare the development is good but I have a problem to retrieve the entire Google drive file tree, I nee

4条回答
  •  自闭症患者
    2020-12-10 06:27

    An easy way to check if a file exist in a specific path is: drive_service.files().list(q="'THE_ID_OF_SPECIFIC_PATH' in parents and title='a file'").execute()

    To walk all folders and files:

    import sys, os
    import socket
    
    import googleDriveAccess
    
    import logging
    logging.basicConfig()
    
    FOLDER_TYPE = 'application/vnd.google-apps.folder'
    
    def getlist(ds, q, **kwargs):
      result = None
      npt = ''
      while not npt is None:
        if npt != '': kwargs['pageToken'] = npt
        entries = ds.files().list(q=q, **kwargs).execute()
        if result is None: result = entries
        else: result['items'] += entries['items']
        npt = entries.get('nextPageToken')
      return result
    
    def uenc(u):
      if isinstance(u, unicode): return u.encode('utf-8')
      else: return u
    
    def walk(ds, folderId, folderName, outf, depth):
      spc = ' ' * depth
      outf.write('%s+%s\n%s  %s\n' % (spc, uenc(folderId), spc, uenc(folderName)))
      q = "'%s' in parents and mimeType='%s'" % (folderId, FOLDER_TYPE)
      entries = getlist(ds, q, **{'maxResults': 200})
      for folder in entries['items']:
        walk(ds, folder['id'], folder['title'], outf, depth + 1)
      q = "'%s' in parents and mimeType!='%s'" % (folderId, FOLDER_TYPE)
      entries = getlist(ds, q, **{'maxResults': 200})
      for f in entries['items']:
        outf.write('%s -%s\n%s   %s\n' % (spc, uenc(f['id']), spc, uenc(f['title'])))
    
    def main(basedir):
      da = googleDriveAccess.DAClient(basedir) # clientId=None, script=False
      f = open(os.path.join(basedir, 'hierarchy.txt'), 'wb')
      walk(da.drive_service, 'root', u'root', f, 0)
      f.close()
    
    if __name__ == '__main__':
      logging.getLogger().setLevel(getattr(logging, 'INFO'))
      try:
        main(os.path.dirname(__file__))
      except (socket.gaierror, ), e:
        sys.stderr.write('socket.gaierror')
    

    using googleDriveAccess github.com/HatsuneMiku/googleDriveAccess

提交回复
热议问题