eld*_*der 6 python csv google-drive-api google-api-python-client google-sheets-api
我正在寻找一种简单的方法来保存源自已发布的Google表格文档的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)
Run Code Online (Sandbox Code Playgroud)
,也不是:
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'))
Run Code Online (Sandbox Code Playgroud)
打印除HTML内容之外的任何内容.
(阅读其他帖子后尝试了第二个版本:使用python将google docs公共电子表格下载到csv.)
对我做错了什么的想法?我已经退出了我的Google帐户,如果这值得做任何事情,但这可以在我尝试过的任何浏览器中使用.据我所知,Google Docs API还没有移植到Python 3上,并且考虑到我个人使用的小项目的"玩具"大小,如果从一开始就使用它,甚至没有多大意义.我可以绕过它.
在第二次尝试中,我离开了"用户代理",因为我认为可能被认为来自脚本的请求(b/c没有识别信息)可能会被忽略,但它没有任何区别.
虽然requests库是从Python的HTTP请求的黄金标准,这种风格下载的是(虽然尚未过时)不可能持续,具体指的是使用环节,管理cookie和重定向等.其中的原因不更喜欢链接的是它不太安全,通常这种访问需要授权.相反,谷歌出口作为表CSV目前公认的方法是使用了谷歌云端硬盘API.
那么为什么选择Drive API呢?这不应该是Sheets API的东西吗?好吧,Sheets API用于面向电子表格的功能,即数据格式化,列调整大小,创建图表,单元格验证等,而Drive API用于面向文件的功能,即导入/导出,复制,重命名,等等
下面是一个完整的cmd-line解决方案.(如果你不这样做的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')
Run Code Online (Sandbox Code Playgroud)
如果您的工作表很大,您可能必须以块的形式导出它 - 请参阅此页面了解如何执行此操作.如果您通常是Google API的新用户,我会为您准备一个(有点过时的)用户友好的介绍视频.(之后有2个视频也可能有用.)
Google 使用一系列 cookie 设置 302 重定向来响应初始请求。如果您不在请求之间存储和重新提交 cookie,它会将您重定向到登录页面。
因此,问题不在于 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')
Run Code Online (Sandbox Code Playgroud)
在向您展示了如何在 vanilla python 中执行此操作后,我现在要说正确的方法是使用最优秀的请求库。它有很好的文档记录,使这些类型的任务完成起来非常愉快。
例如,csv_content使用requests库获得与上述相同的结果非常简单:
>>> import requests
>>> csv_content = requests.get(DOC_URL).text
Run Code Online (Sandbox Code Playgroud)
那一行更清楚地表达了您的意图。它更容易编写和阅读。帮您自己 - 以及共享您的代码库的任何其他人 - 帮个忙,只需使用requests.
| 归档时间: |
|
| 查看次数: |
2716 次 |
| 最近记录: |