我正在使用requests库和Python 2.7从Web API下载一个gzipped文本文件。使用下面的代码,我能够成功地发送一个get请求,并且从头部判断得出收到了一个gzip文件形式的响应。
我知道如果Requests检测到响应是gzip格式,它会自动解压缩这些文件。我想把这个下载以文件流的形式写入磁盘以供存储和未来分析。
然而,当我在我的工作目录中打开结果文件时,我得到像这样的字符:—}}¶— Q@Ï 'õ
为了参考,一些响应头包括'Content-Encoding': 'gzip','Content-Type': 'application/download','Accept-Encoding,User-Agent'
我用二进制写错了吗?我没有正确编码文本(例如,ASCII与utf-8之间的区别)吗?响应头中没有明显的字符编码。
我知道如果Requests检测到响应是gzip格式,它会自动解压缩这些文件。我想把这个下载以文件流的形式写入磁盘以供存储和未来分析。
然而,当我在我的工作目录中打开结果文件时,我得到像这样的字符:—}}¶— Q@Ï 'õ
为了参考,一些响应头包括'Content-Encoding': 'gzip','Content-Type': 'application/download','Accept-Encoding,User-Agent'
我用二进制写错了吗?我没有正确编码文本(例如,ASCII与utf-8之间的区别)吗?响应头中没有明显的字符编码。
try:
response = requests.get(url, paramDict, stream=True)
except Exception as e:
print(e)
with open(outName, 'wb') as out_file:
for chunk in response.iter_content(chunk_size=1024):
out_file.write(chunk)
2016年3月30日更新: 现在我已经稍微改了一下我的代码,使用了gzipstream库。我尝试使用该流读取响应内容中的整个压缩文本文件:
with open(outName, 'wb') as out_file, GzipStreamFile(response.content) as fileStream:
streamContent = fileStream.read()
out_file.write(streamContent)
我遇到了这个错误: out_file.write(streamContent) AttributeError: '_GzipStreamFile' object has no attribute 'close'
输出的结果是一个空文本文件,文件名如预期。我需要在with
块外初始化streamContent变量,以便它不会在块结束时自动调用close方法吗?
2016年4月1日编辑 我想澄清一下,这不一定要是流,那只是我遇到的一个解决方案。我只是想每天请求这个压缩文件并将其保存为纯文本文件。