gpt4 book ai didi

python - 有没有更好的方法用 urlopen 做 csv/namedtuple?

转载 作者:太空宇宙 更新时间:2023-11-04 09:10:02 27 4
gpt4 key购买 nike

使用 namedtuple文档示例作为我在 Python 3.3 中的模板,我有以下代码来下载 csv 并将其转换为一系列 namedtuple 子类实例:

from collections import namedtuple
from csv import reader
from urllib.request import urlopen

SecurityType = namedtuple('SecurityType', 'sector, name')

url = 'http://bsym.bloomberg.com/sym/pages/security_type.csv'
for sec in map(SecurityType._make, reader(urlopen(url))):
print(sec)

这引发了以下异常:

Traceback (most recent call last):
File "scrap.py", line 9, in <module>
for sec in map(SecurityType._make, reader(urlopen(url))):
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

我知道问题是 urlopen 返回的是字节而不是字符串,我需要在某个时候解码输出。下面是我现在的做法,使用 StringIO:

from collections import namedtuple
from csv import reader
from urllib.request import urlopen
import io

SecurityType = namedtuple('SecurityType', 'sector, name')

url = 'http://bsym.bloomberg.com/sym/pages/security_type.csv'
reader_input = io.StringIO(urlopen(url).read().decode('utf-8'))

for sec in map(SecurityType._make, reader(reader_input)):
print(sec)

这听起来很有趣,因为我基本上是在字节缓冲区上迭代、解码、重新缓冲,然后在新的字符串缓冲区上迭代。如果没有两次迭代,是否有更 Pythonic 的方法来做到这一点?

最佳答案

使用io.TextIOWrapper()解码 urllib 响应:

reader_input = io.TextIOWrapper(urlopen(url), encoding='utf8', newline='')

现在 csv.reader 被传递给以文本模式打开文件系统上的常规文件时获得的完全相同的界面

通过此更改,您的示例 URL 适用于 Python 3.3.1:

>>> for sec in map(SecurityType._make, reader(reader_input)):
... print(sec)
...
SecurityType(sector='Market Sector', name='Security Type')
SecurityType(sector='Comdty', name='Calendar Spread Option')
SecurityType(sector='Comdty', name='Financial commodity future.')
SecurityType(sector='Comdty', name='Financial commodity generic.')
SecurityType(sector='Comdty', name='Financial commodity option.')
...
SecurityType(sector='Muni', name='ZERO COUPON, OID')
SecurityType(sector='Pfd', name='PRIVATE')
SecurityType(sector='Pfd', name='PUBLIC')
SecurityType(sector='', name='')
SecurityType(sector='', name='')
SecurityType(sector='', name='')
SecurityType(sector='', name='')
SecurityType(sector='', name='')
SecurityType(sector='', name='')
SecurityType(sector='', name='')
SecurityType(sector='', name='')
SecurityType(sector='', name='')

最后几行似乎产生了空元组;原文确实有几行,上面只有一个逗号。

关于python - 有没有更好的方法用 urlopen 做 csv/namedtuple?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16374913/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com