-1

我正在尝试将来自网络的 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() 转换为字符串并剥离前导字符,因为文档在这里说没有运气。

4

1 回答 1

1

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

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

针对您更新的问题: 从标题行中删除前导文本可能是不可取的,因为这充当了第一列数据的字段名称。最好丢弃前 2 行数据,然后将所需的字段名称直接提供给 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
于 2013-09-19T03:36:31.723 回答