你如何节省谷歌张纸的Python 3(或2)文件为CSV?(How do you save a Go

2019-07-20 17:23发布

我正在寻找一种简单的方法来保存csv文件从已发布的谷歌文档表起源? 由于它的出版,它是通过直接链接(在下面的例子中修改于目的)访问。

我所有的浏览器会提示我尽快保存csv文件,我启动的链接。

无论是:

DOC_URL = 'https://docs.google.com/spreadsheet/ccc?key=0AoOWveO-dNo5dFNrWThhYmdYW9UT1lQQkE&output=csv'    

f = urllib.request.urlopen(DOC_URL)
cont = f.read(SIZE)
f.close()
cont = str(cont, 'utf-8')
print(cont)

,也不:

req = urllib.request.Request(DOC_URL)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.13 (KHTML, like Gecko) Chrome/24.0.1284.0 Safari/537.13')
f = urllib.request.urlopen(req)
print(f.read().decode('utf-8'))

打印任何东西,但HTML内容。

(试过第二版阅读本其他职位后: 下载谷歌文档电子表格公众与蟒蛇到csv )。

什么我做错了任何想法? 我登录了我的谷歌帐户,如果这一点,实在值得任何东西,但我没有尝试过任何浏览器的工作原理。 据我了解,谷歌文档API尚未移植关于Python 3并给予我个人使用的小项目的“玩具”的大小,它甚至没有什么太大的意义,从一开始走,如果用它我可以绕过它。

在第2次尝试,我离开了“用户代理”,因为我想,也许请求看作从脚本来(B / C没有身份信息存在的话)可能被忽略,但它并没有发挥作用。

Answer 1:

谷歌回应了一系列的cookie设置302个重定向的初始请求。 如果不保存并重新提交请求之间的饼干,它重定向到登录页面。

所以,这个问题是不是与User-Agent头,这是在默认情况下,事实urllib.request.urlopen不存储cookie,但会遵循HTTP 302个重定向。

下面的代码工作得很好,在上按指定的位置提供一个公共的电子表格DOC_URL

>>> from http.cookiejar import CookieJar
>>> from urllib.request import build_opener, HTTPCookieProcessor
>>> opener = build_opener(HTTPCookieProcessor(CookieJar()))
>>> resp = opener.open(DOC_URL)
>>> # should really parse resp.getheader('content-type') for encoding.
>>> csv_content = resp.read().decode('utf-8')

已经展示了如何做到这一点的香草蟒蛇,现在我会说的正确方法™去这是使用最优秀的请求库 。 这是非常有据可查 ,使这些各种各样的任务极其愉快的完成。

例如,为了获得同样的csv_content如上使用requests库是简单的:

>>> import requests
>>> csv_content = requests.get(DOC_URL).text

这一条线更清晰地表达你的意图。 它更容易写,更容易阅读。 请你-和其他人谁共享你的代码-一个忙,只是使用requests



Answer 2:

虽然requests库是从Python的HTTP请求的黄金标准,这种风格下载的是(虽然尚未过时)不可能持续,具体指的是使用环节,管理cookie和重定向等。其中的原因喜欢的链接是它的安全性较低,一般这样的访问应该需要授权。 相反,谷歌出口作为表CSV目前公认的方法是使用 谷歌云端硬盘API 。

那么,为什么驱动器API? 这难道不应该是后话, 表API呢? 那么,床单API是用于电子表格取向的功能,即,数据格式,列调整大小,创建图表,细胞验证等,而驱动器API是文件取向的功能,即,导入/导出,复制,重命名,等等

下面是一个完整的CMD线的解决方案 。 (如果你不这样做的Python,你可以把它当作伪代码,并选择由支持的任何语言谷歌API客户端库 )。对于代码片段,假设最新的命名表inventory (旧文件,与该名称将被忽略)和DRIVE是API服务端点:

FILENAME = 'inventory'
SRC_MIMETYPE = 'application/vnd.google-apps.spreadsheet'
DST_MIMETYPE = 'text/csv'

# query for latest file named FILENAME
files = DRIVE.files().list(
    q='name="%s" and mimeType="%s"' % (FILENAME, SRC_MIMETYPE),
    orderBy='modifiedTime desc,name').execute().get('files', [])

# if found, export Sheets file as CSV
if files:
    fn = '%s.csv' % os.path.splitext(files[0]['name'].replace(' ', '_'))[0]
    print('Exporting "%s" as "%s"... ' % (files[0]['name'], fn), end='')
    data = DRIVE.files().export(fileId=files[0]['id'], mimeType=DST_MIMETYPE).execute()

    # if non-empty file
    if data:
        with open(fn, 'wb') as f:
            f.write(data)
        print('DONE')

如果你的表是大,你可能不得不将其导出成块-看到这个页面上如何做到这一点 。 如果你一般是新的谷歌API的,我有一个(有点过时,但)人性化的介绍视频为您服务。 (有2个视频后这可能有用的。)



文章来源: How do you save a Google Sheets file as CSV from Python 3 (or 2)?