通过API获取的CSV文件无法正确打印到各行

时间:2015-08-06 06:24:36

标签: python csv

我对Python很陌生,我正在努力通过观看视频/阅读教程来学习。

我关注如何从Quandl获取数据的this video。我知道python已经有一个特定的模块,但我想学习如何在必要时从网站上获取它。我的问题是,当我尝试在9:50左右模拟代码并打印结果时,python不会分割CSV file中的行。我知道他正在使用python 2.x,而我正在使用3.4。

这是我使用的代码:

import urllib
from urllib.request import urlopen

def grabQuandl(ticker):
    endLink = 'sort_order=desc'#without authtoken

    try:
        salesRev = urllib.request.urlopen('https://www.quandl.com/api/v1/datasets/SEC/'+ticker+'_SALESREVENUENET_Q.csv?&'+endLink).read()

        print (salesRev)   

    except Exception as e:
        print ('failed the main quandl loop for reason of', str(e))

grabQuandl('AAPL')

这就是印刷品:

  

b'Date,价值\ n2009-06-27,8337000000.0 \ n2009-12-26,15683000000.0 \ n2010-03-27,13499000000.0 \ n2010-06-26,15700000000.0 \ n2010-09-25,20343000000.0 \ N2010 -12-25,26741000000.0 \ n2011-03-26,24667000000.0 \ n2011-06-25,28571000000.0 \ n2011-09-24,28270000000.0 \ n2011-12-31,46333000000.0 \ n2012-03-31,39186000000.0 \ n2012-06 -30,35023000000.0 \ n2012-09-29,35966000000.0 \ n2012-12-29,54512000000.0 \ n2013-03-30,43603000000.0 \ n2013-06-29,35323000000.0 \ n2013-09-28,37472000000.0 \ n2013-12-28 ,57594000000.0 \ n2014-03-29,45646000000.0 \ n2014-06-28,37432000000.0 \ n2014-09-27,42123000000.0 \ n2014-12-27,74599000000.0 \ n2015-03-28,58010000000.0 \ N'

我认为\n是某种分线器,但它不像视频那样工作。我已经使用read().split()搜索了可能的解决方案,例如执行for循环,但最好只删除\ n。我无法将输出输入到视频中的表格中。我做错了什么?

1 个答案:

答案 0 :(得分:2)

.read()给你一个字节字符串,当你直接打印它时,你会得到你得到的结果。你可以注意到引号前面的b,它表示字节串

您应该在打印之前(或使用.read()直接解码您获得的字符串。例如 -

import urllib
from urllib.request import urlopen

def grabQuandl(ticker):
    endLink = 'sort_order=desc'#without authtoken

    try:
        salesRev = urllib.request.urlopen('https://www.quandl.com/api/v1/datasets/SEC/'+ticker+'_SALESREVENUENET_Q.csv?&'+endLink).read().decode('utf-8')

        print (salesRev)   

    except Exception as e:
        print ('failed the main quandl loop for reason of', str(e))

grabQuandl('AAPL')

以上使用utf-8编码对返回的数据进行解码,您可以使用您想要的任何编码(无论数据编码是什么)。

显示打印行为的示例 -

>>> s = b'asd\nbcd\n'
>>> print(s)
b'asd\nbcd\n'
>>> print(s.decode('utf-8'))
asd
bcd

>>> type(s)
<class 'bytes'>