将csv解析为dict

时间:2013-09-19 03:09:32

标签: python parsing csv financial

我正在尝试将网络上的csv财务数据解析成一个我可以通过密钥导航的字典。
我没有使用csv.DictReader 我有:

import csv
import urllib2
req = urllib2.Request('http://financials.morningstar.com/ajax/ReportProcess4CSV.html?&t=XNAS:BRCM&region=usa&culture=en-US&cur=USD&reportType=is&period=12&dataType=A&order=desc&columnYear=5&rounding=3&view=raw&r=886300&denominatorView=raw&number=3')
response = urllib2.urlopen(req)
response.next() 
csvio = (csv.DictReader(response))
print csvio.fieldnames 
print len(csvio.fieldnames)

编辑以反映以下答案的变化。

这几乎让我在那里,但我需要在将它提供给DictReader之前剥离领先的“财政年度......共享数据”。怎么做到最好?我已经看过转换为字符串并使用str.lstrip()剥离引导字符,因为文档说here没有运气。

1 个答案:

答案 0 :(得分:1)

要使用DictReader,您需要指定字段名称,或者字段名称需要是csv数据的第一行(即标题行)。

在代码检索的csv文件中,字段名称位于第二行数据中,而不是第一行。我所做的是在将csv文件传递给DictReader构造函数之前抛出第一行数据。

回复您更新的问题: 从标题行中删除前导文本可能是不可取的,因为它充当第一列数据的字段名称。可能最好丢弃前两行数据,然后直接向DictReader提供所需的字段名称。我已更新下面的示例以反映这一点。

import csv
import urllib2

req = urllib2.Request('http://financials.morningstar.com/ajax/ReportProcess4CSV.html?&t=XNAS:BRCM&region=usa&culture=en-US&cur=USD&reportType=is&period=12&dataType=A&order=desc&columnYear=5&rounding=3&view=raw&r=886300&denominatorView=raw&number=3')
response = urllib2.urlopen(req)

response.readline() # This reads (and discards) the first row of data which is not needed.
response.readline() # skip the 

myFieldnames = ["firstColName", "TTM", "2012", "2011", "2010", "2009", "2008"]
csvio = csv.DictReader(response, fieldnames=myFieldnames)

print csvio.fieldnames 
for row in csvio:
    print row