使用python3从urllib解码字节,有更好的方法吗?

时间:2012-07-11 08:58:02

标签: python string python-3.x byte decode

我最近重新编写了一些代码到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'))]

看起来更干净!

2 个答案:

答案 0 :(得分:1)

通常我们get a reader并将其传递给那里。

答案 1 :(得分:1)

我建议使用codecs.iterdecode

data = list(csv.reader(codecs.iterdecode(urllib.request.urlopen(...), "iso-8859-1")))