我正在尝试从晨星网下载CSV内容,然后解析其内容。如果我直接将HTTP内容注入到Python的CSV解析器中,结果格式不正确。但是,如果我将HTTP内容保存到文件(/tmp/tmp.csv),然后在Python的CSV解析器中导入该文件,则结果是正确的。换句话说:
def finDownload(code,report):
h = httplib2.Http('.cache')
url = 'http://financials.morningstar.com/ajax/ReportProcess4CSV.html?t=' + code + '®ion=AUS&culture=en_us&reportType='+ report + '&period=12&dataType=A&order=asc&columnYear=5&rounding=1&view=raw&productCode=usa&denominatorView=raw&number=1'
headers, data = h.request(url)
return data
balancesheet = csv.reader(finDownload('FGE','is'))
for row in balancesheet:
print row
返回:
['F']
['o']
['r']
['g']
['e']
[' ']
['G']
['r']
['o']
['u']
(etc...)
改为:
[Forge Group Limited (FGE) Income Statement']
?
splitlines
在 Python 3 中也消失了吗?我一直比split('\n')
更喜欢它,因为我患有反斜杠恐惧症。 - PaulMcGcsvstring
是一个糟糕的列表名称。通常,CSV文件使用CR LF作为行分隔符;不要使用mystring.split('\n')
,请使用mystring.splitlines()
。StringIO
并未“消失”,它已经搬到了io
模块,并更名为BytesIO
。还有一个适用于py3kstr
对象的StringIO
。请参见http://docs.python.org/py3k/library/io.html#module-io - John MachincStringIO.StringIO
。OP的数据中既没有'
也没有"
。默认(几乎普遍使用的)quotechar
是"
。由于您希望显示带引号的嵌入式LF的正确行为,因此最好放弃'
quotechar。您的py3示例以str
对象开始是不现实的。Python提供的urllib.request.urlopen(url).read()
会生成bytes
。请注意,有效负载以UTF-8“BOM”开头(当然,对于py2和py3都是如此),其余所有字节都是ASCII码。希望有所帮助 :) - John Machin