我最近正在将一些代码重写为 python3,并寻找一个干净的 pythonic 解决方案来解码 urllib.request.urlopen 返回的字节以传递给 csv.reader
我想出了以下内容:
import urllib.request
def fetch(symbol='IBM'):
kwargs = { 'symbol': symbol,
'start_month': '01',
'start_day': '01',
'start_year': '2002',
'end_month': '12',
'end_day': '31',
'end_year': '2012',
}
urlstring = 'http://ichart.finance.yahoo.com/table.csv?s={symbol}&a={start_month}&b={start_day}&c={start_year}&d={end_month}&e={end_day}&f={end_year}&g=d&ignore=.csv'.format(**kwargs)
data = [row for row in csv.reader(map(bytes.decode, urllib.request.urlopen(urlstring), ('iso-8859-1' for i in iter(lambda:0,1))))]
return data
我想知道是否有更好的解决方案?本质上,url 返回一个 csv 文件,在 Python 2.x 中我只能使用 urllib2 并将 urllib2.urlopen() 的返回值传递给 csv.reader() 但是,在 Python 3.x 中我们现在返回字节,所以我将响应映射到 bytes.decode 并将其传递回 csv.reader。但我很好奇是否有更好的方法来做到这一点,或者也许我在寻找最佳解决方案时错过了一些东西?
处理这种情况的正确 Pythonic 方法是什么?在将返回的对象传递给另一个要迭代的函数之前,需要对返回的对象进行解码?
编辑: 谢谢伊格纳西奥!
查看您给我的链接,我得到以下解决方案:
data=[row for row in csv.reader(codecs.iterdecode(urllib.request.urlopen(urlstring),'iso-8859-1'))]
看起来干净多了!
最佳答案
通常我们get a reader并将其传递到那里。
关于python - 使用 python3 从 urllib 解码字节,有更好的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11429013/