0

我是 python 新手,CSV 解析器有问题。这是代码:

import urllib2
import csv


u = urllib2.urlopen(r'http://finance.yahoo.com/d/quotes.csv?s=AAPL+GOOG+MSFT&f=nab')
data = u.read()

reader = csv.reader(data)

for row in reader:
    print row

雅虎返回这个原始 csv:

"Apple Inc.",482.09,482.00
"Google Inc.",877.20,876.94
"Microsoft Corpora",33.34,33.33

我想解析它并创建一个包含 3 个字段的简单 JSON 对象:Ticker、Bid、Offer

但是数据来自 csv.reader() ,如下所示:

['Apple Inc.']
['', '']
['4']
['8']
['2']
['.']
['5']
['5']
['', '']
['4']
['8']
['2']
['.']
['4']
['8']
[]
[]
['Google Inc.']
['', '']
['8']
['7']
['6']
['.']
['2']
['4']
['', '']
['8']
['7']
['6']
['.']
['1']
['0']
[]
[]
['Microsoft Corpora']
['', '']
['3']
['3']
['.']
['2']
['9']
['', '']
['3']
['3']
['.']
['2']
['8']
[]
[]

它似乎打破了每个数字的行。关于我在这里做错了什么的任何想法?

4

3 回答 3

4

只需u直接解析到阅读器中:

import urllib2
import csv

u = urllib2.urlopen(r'http://finance.yahoo.com/d/quotes.csv?s=AAPL+GOOG+MSFT&f=nab')

reader = csv.reader(u)

for row in reader:
    print row

问题是csv.reader接受可迭代的行。当你传递一个字符串时,它认为每个字符都是一行。事实上,它不只是给出单字符元素的原因是由于引号。

u已经是一个可迭代的行,所以直接传入就可以了。

于 2013-09-27T20:29:35.190 回答
1

csv.readerfactory 将列表或其他可迭代的行作为其第一个参数,而不是其中带有换行符的完整字符串(它只会按字符迭代)。使用data = u.readlines()而不是data = u.read().

于 2013-09-27T20:28:07.340 回答
0

引用:

所谓的 CSV(逗号分隔值)格式是电子表格和数据库最常见的导入和导出格式。没有“CSV 标准”,因此格式由许多读写它的应用程序在操作上定义。缺乏标准意味着不同应用程序产生和使用的数据中经常存在细微的差异。这些差异会使处理来自多个来源的 CSV 文件变得很烦人。尽管如此,虽然分隔符和引用字符有所不同,但整体格式非常相似,因此可以编写一个可以有效操作此类数据的模块,从而向程序员隐藏读取和写入数据的细节。

尝试制作自己的 csv 并查看它是否有效,如果可以,那么它们的 csv 格式会有所不同。

于 2013-09-27T20:30:50.190 回答