使用Python requests.get()获取CSV/TSV格式谷歌表格多行字段问题
问题背景
我有一个包含多行字段的谷歌表格,可通过以下URL导出为CSV或TSV格式:
- CSV导出链接:
https://docs.google.com/spreadsheets/d/e/Eis4Ya-Le9Py/pub?gid=0&single=true&output=csv - TSV导出链接:
https://docs.google.com/spreadsheets/d/e/Eis4Ya-Le9Py/pub?gid=0&single=true&output=tsv
手动下载文件后,用OpenOffice能正常识别多行字段——这些多行字段会被双引号包裹,纯文本编辑器里也能看到该格式。但用Python的requests库发送get请求获取文件时,双引号却被移除了。
示例代码
import requests r = requests.get(url) print(r.text) print(r.content) print(r.headers)
返回内容
文本输出:
id description 1 one line 2 line1 line2 3 l1 l2 empty line below end 4 normal
字节内容输出:
b'id\tdescription\r\n1\tone line\r\n2\tline1 line2\r\n3\tl1 l2 empty line below end\r\n4\tnormal'
响应头:
{'Content-Type': 'text/tab-separated-values', 'X-Frame-Options': 'ALLOW-FROM https://docs.google.com', ... , 'Transfer-Encoding': 'chunked'}
问题
该现象原因是什么?如何修改此行为?注:所处环境无法使用csv处理库。
解答
原因分析
谷歌表格导出服务会根据请求的Accept请求头调整返回内容格式:
- 浏览器或文件下载工具请求时,发送的Accept头通常包含
text/csv或application/octet-stream这类明确标识,谷歌会返回带双引号包裹多行字段的标准格式。 - requests库默认发送的Accept头是
*/*(接受所有类型),再加上响应头的Transfer-Encoding: chunked,谷歌导出服务会自动去掉双引号,将多行字段合并为单行返回,导致格式丢失。
解决方法
手动给requests的get请求添加指定的Accept头,明确告诉谷歌服务返回带引号的标准TSV/CSV格式:
针对TSV的修改代码:
import requests headers = { 'Accept': 'text/tab-separated-values' } r = requests.get(url, headers=headers) print(r.content)
针对CSV的修改代码:
import requests headers = { 'Accept': 'text/csv' } r = requests.get(url, headers=headers) print(r.content)
添加指定Accept头后,谷歌服务会返回和手动下载一致的、带双引号包裹多行字段的原始格式。
内容的提问来源于stack exchange,提问作者Rub
相关产品推荐
相关产品推荐

