在Python中从URL下载csv.gz文件

7

我在从URL下载csv.gz文件时遇到了问题,但是我可以轻松地下载tar.gz文件。对于csv.gz文件,我能够提取.gz文件并读取我的csv文件,但如果我事先没有csv-1.0.csv.gz文件,使用URL会更方便。

这个有效:

import urllib.request
urllib.request.urlretrieve('http://www.mywebsite.com/csv-1-0.tar.gz','csv-1-0.tar.gz')

这个不起作用:

import urllib.request
urllib.request.urlretrieve('http://www.mywebsite.com/csv-1-0.csv.gz','csv-1-0.csv.gz')

我收到了这个错误:UnicodeEncodeError:“ascii”编解码器无法在第9个位置编码字符“\xad”:编号不在128的范围内。

“这不起作用”是什么意思?是异常吗?没有错误信息但没有文件吗? - Mike Müller
我得到了这个错误:UnicodeEncodeError: 'ascii'编解码器无法在位置9处编码字符'\xad',因为它超出了128的范围。 - Evan Ryan
你能在你的问题中添加完整的堆栈跟踪吗?我想知道哪些行出现了错误。 - tdelaney
1个回答

14

urllib.request文档的一开始就建议使用卓越的requests模块来实现更高级别的HTTP客户端接口。代码非常简单:

import requests

url = "http://www.mywebsite.com/csv-1-0.csv.gz"
filename = url.split("/")[-1]
with open(filename, "wb") as f:
    r = requests.get(url)
    f.write(r.content)

基本上,在分配URL和目标文件名之后,您以二进制模式打开目标文件进行写入,请求文件,然后将请求的内容写入文件。完成了。


我已经按照你上面的做了,但是它不起作用。当我下载csv-1-0.csv.gz并在记事本中打开它时,它只是简单的HTML?当我尝试下载一个zip文件时也是同样的情况。谢谢。 - Evan Ryan
@EvanRyan,HTML文件的内容是什么?这可能意味着服务器出现了某些配置问题,或者链接已经失效(HTTP 404)。您能否从Web浏览器中下载该文件?如果可以,那么您需要正确设置GET请求的标头。 - MattDMo
我没有正确设置GET请求的头部信息。现在它已经可以工作了。谢谢。 - Evan Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接