我是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
Yahoo返回此原始csv:
"Apple Inc.",482.09,482.00
"Google Inc.",877.20,876.94
"Microsoft Corpora",33.34,33.33
我想解析这个并创建一个包含3个字段的简单JSON对象: 股票,买入,卖出
但数据来自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']
[]
[]
似乎打破了每个数字上的行。关于我在这里做错了什么想法?
答案 0 :(得分: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
已经是一个可迭代的行,所以只需传入即可。
答案 1 :(得分:1)
csv.reader
工厂将第一个参数作为列表或其他可迭代行的第一个参数,而不是带有换行符的完整字符串(它将按字符迭代)。使用data = u.readlines()
代替data = u.read()
。
答案 2 :(得分:0)
引用:
所谓的CSV(逗号分隔值)格式是电子表格和数据库最常用的导入和导出格式。没有“CSV标准”,因此格式在操作上由许多读写它的应用程序定义。缺乏标准意味着不同应用程序生成和使用的数据通常存在细微差别。这些差异会使从多个来源处理CSV文件变得很烦人。尽管如此,虽然分隔符和引用字符各不相同,但整体格式足够相似,可以编写单个模块,可以有效地操作这些数据,隐藏从程序员那里读取和写入数据的细节。
尝试创建自己的csv并查看它是否有效,如果是,那么它们的csv格式会有所不同。