使用Python 3.4从Yahoo读取股票数据,但无法删除数据

0 投票
1 回答
687 浏览
提问于 2025-04-18 15:17

我正在使用Python 3.4,想从Yahoo财经下载数据。
下面是我的代码:

import urllib.request  
url = 'http://ichart.finance.yahoo.com/table.csv?s=aapl&a=6&b=21&c=2014&d=6&e=29&f=2014'  
csv = urllib.request.urlopen(url).readlines()  
print(csv)  
ds,open_,high,low,close,volume,adjc = csv[1].strip().split('\n')

结果:

[b'Date,Open,High,Low,Close,Volume,Adj Close\n', b'2014-07-29,99.33,99.44,98.25,98.38,43031400,98.38\n', b'2014-07-28,97.82,99.24,97.55,99.02,55239000,99.02\n', b'2014-07-25,96.85,97.84,96.64,97.67,43403200,97.67\n', b'2014-07-24,97.04,97.32,96.42,97.03,45663100,97.03\n', b'2014-07-23,95.42,97.88,95.17,97.19,92844700,97.19\n', b'2014-07-22,94.68,94.89,94.12,94.72,54914800,94.72\n', b'2014-07-21,94.99,95.00,93.72,93.94,38887700,93.94\n']  

Traceback (most recent call last):  
  File "<pyshell#39>", line 1, in <module>  
    ds,open_,high,low,close,volume,adjc = csv[1].strip().split('\n')  
TypeError: Type str doesn't support the buffer API

现在我遇到的问题是,当我尝试把csv文件分割开,并把每一行存储为一个单独的值时,遇到了困难。
我想分割并存储报价,但我做不到,因为每行前面都有一个'b'字符,后面还有一个'\n'换行符。你们能帮我分割一下,或者给我推荐一个其他的写法吗?

非常感谢你们的帮助。
谢谢!

1 个回答

2

1) 我觉得 requests 这个库比 urllib.request 要简单得多。

2) 如果数据是CSV格式的,我建议使用 csv 模块,而不是自己去解析文件。

下面是我会怎么做:

#!/usr/bin/python3

import requests
import csv
import pprint

url='http://ichart.finance.yahoo.com/table.csv?s=aapl&a=6&b=21&c=2014&d=6&e=29&f=2014'

http_response=requests.get(url)
stock_reader=csv.reader(http_response.text.splitlines())
stock_data=list(stock_reader)
pprint.pprint(stock_data)

ds,open_,high,low,close,volume,adjc = stock_data[1]
print("The stock opened at {} on {}".format(open_,ds))
print("The average closing price was {0:.02f}".format(
    sum(float(item[4]) for item in stock_data[1:])/len(stock_data[1:])))

为了更方便,你可以试试 csv.DictReader

http_response=requests.get(url)
stock_reader=csv.DictReader(http_response.text.splitlines())
stock_data=list(stock_reader)

print("The stock opened at {Open} on {Date}".format(**stock_data[0]))
print("The average closing price was {0:.02f}".format(
    sum(float(item['Close']) for item in stock_data)/len(stock_data)))

撰写回答