【问题标题】:decoding bytes from urllib using python3, is there a better way?使用python3从urllib解码字节,有更好的方法吗?
【发布时间】:2012-07-10 20:32:54
【问题描述】:

我最近正在为 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'))]

看起来干净多了!

【问题讨论】:

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


    【解决方案1】:

    通常我们get a reader 并通过那里传递。

    【讨论】:

      【解决方案2】:

      我建议使用codecs.iterdecode:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-14
        • 2015-12-31
        • 2023-01-31
        • 1970-01-01
        • 2016-12-02
        • 2017-03-24
        • 1970-01-01
        相关资源
        最近更新 更多