如何使用Python脚本从驱动器API下载文件

如何使用Python脚本从驱动器API下载文件,python,file,download,google-drive-api,google-apps,Python,File,Download,Google Drive Api,Google Apps,我正在用Python编写一个简单的脚本,它可以从GoogleApps域驱动服务下载和导出所有文件。我能够使用服务帐户创建驱动器会话,并从列表查询中获得JSON输出。我还根据本文定义了下载功能: 问题是这个函数返回另一个名为content的JSON输出,但我不知道如何将文件本地存储在HDD上。 我研究了CURL是否可以在Python脚本中使用,并找到了urllib/urllib2,它应该与CURL类似使用。但如果我尝试使用urllib2通过以下方式读取远程文件: remote_file = ur

我正在用Python编写一个简单的脚本,它可以从GoogleApps域驱动服务下载和导出所有文件。我能够使用服务帐户创建驱动器会话,并从列表查询中获得JSON输出。我还根据本文定义了下载功能:

问题是这个函数返回另一个名为content的JSON输出,但我不知道如何将文件本地存储在HDD上。 我研究了CURL是否可以在Python脚本中使用,并找到了urllib/urllib2,它应该与CURL类似使用。但如果我尝试使用urllib2通过以下方式读取远程文件:

remote_file = urllib2.urlopen(download_url).read()
我得到401错误取消筛选

因此,看起来urllib2正在工作,但没有使用存储的凭据

那么,如何使用urllib/2创建授权查询呢?或者,从脚本中本地存储文件的正确方法是什么?是否有其他特定于python或google的库可以帮助我在本地存储文件

提前谢谢

编辑:我正在使用谷歌API客户端库。问题是函数download_文件返回一些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
这会在硬盘上创建文件,但在尝试读取内容时失败。我不知道如何处理内容以适合写入本地磁盘

编辑2:


好吧,我终于明白了。我的错误是我试图对内容使用函数read()。我只需要使用file.write(content)

您可以从中尝试此脚本。记住要使用


下面的代码帮助您将文件内容保存在本地文件中。只需在下面的代码中替换路径和文件扩展名

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

谢谢你的回复,实际上这正是我正在使用的。但问题是,这个函数返回的内容只是一个JSON输出,但我不知道如何将文件保存到本地存储(HDD)中。这是否回答了您的问题?
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