2013-05-21 5 views
5

Я работаю над простым скриптом на Python, который может загружать и экспортировать все файлы из домена Google Apps Drive Service. Мне удалось создать сеанс Drive с помощью учетной записи службы, и я получаю вывод JSON из запроса списка. Я также определил функцию загрузки в соответствии с этой статьей:Howto скачать файл из Drive API с помощью скрипта Python

https://developers.google.com/drive/manage-downloads

Проблема заключается в том, что эта функция возвращает другой выход JSON под названием содержание, но я не могу понять, как сохранить файл на локальном жестком диске. Я искал CURL, если он может быть использован внутри скрипта Python и найден urllib/urllib2, который следует использовать аналогично CURL. Но если я пытаюсь использовать urllib2 прочитать удаленный файл с помощью:

remote_file = urllib2.urlopen(download_url).read() 

Я получаю 401 Ошибка самовольных.

Таким образом, похоже, что urllib2 работает, но не использует сохраненные учетные данные.

Так как я могу создать авторизованный запрос с помощью urllib/2? Или как правильно хранить файл локально из сценария? Есть ли другая другая библиотека python или google, которая может помочь мне хранить файлы локально?

Заранее спасибо.

EDIT: Я использую клиентскую библиотеку API Google API. Проблема в том, что функция download_file возвращает некоторый вывод JSON, но я не могу сохранить файл в локальном хранилище.

Я пытался что-то вроде этого:

def download_file(service, drive_file): 
    """Download a file's content. 

    Args: 
      service: Drive API service instance. 
      drive_file: Drive File instance. 

    Returns: 
      File's content if successful, None otherwise. 
    """ 
    download_url = drive_file.get('downloadUrl') 
    if download_url: 
      resp, content = service._http.request(download_url) 
      if resp.status == 200: 
        print 'Status: %s' % resp 
        #return content 
        title = drive_file.get('title') 
        path = './data/'+title 
        file = open(path, 'wb') 
       # remote_file = urllib2.urlopen(download_url).authorize().read() 
        file.write(content.read()) 
      else: 
        print 'An error occurred: %s' % resp 
        return None 
    else: 
      # The file doesn't have any content stored on Drive. 
      return None 

Это создает файл на жестком диске, но он терпит неудачу, когда пытается читать содержимое. Я не знаю, как обрабатывать контент, подходящий для записи на локальный диск.

EDIT2:

Хорошо, так что я, наконец, понять, что из. Моя ошибка заключалась в том, что я пытался использовать функцию read() в контенте. Мне просто нужно использовать file.write (content).

ответ

6

Вы можете попробовать этот шрифт с the article. И не забудьте использовать Google APIs Client Library for Python.

from apiclient import errors 
# ... 

def download_file(service, drive_file): 
    """Download a file's content. 

    Args: 
    service: Drive API service instance. 
    drive_file: Drive File instance. 

    Returns: 
    File's content if successful, None otherwise. 
    """ 
    download_url = drive_file.get('downloadUrl') 
    if download_url: 
     resp, content = service._http.request(download_url) 
    if resp.status == 200: 
     print 'Status: %s' % resp 
     return content 
    else: 
     print 'An error occurred: %s' % resp 
     return None 
    else: 
    # The file doesn't have any content stored on Drive. 
    return None 
+2

Спасибо за ответ, на самом деле это именно то, что я использую. Но проблема в том, что эта функция возвращает контент, который является только выходом JSON, но я не могу понять, как сохранить файл в локальном хранилище (HDD). – Beneato

0

Ниже код помогает сохранить содержимое файла в локальном файле. Просто замените путь & расширением файла в нижнем коде.

if download_url: 
    resp, content = service._http.request(download_url) 
    if resp.status == 200: 
     print ('Status: %s' % resp) 
     title = file.get('title') 
     path = './data/'+title+".csv" 
     file1 = open(path, 'wb') 
     file1.write(content) 
    else: 
     print ('An error occurred: %s' % resp) 
     return None 
else: 
    # The file doesn't have any content stored on Drive. 
    return None 
Смежные вопросы