所以我这样做了:
def get_quotes(ticker:str, start_date:datetime.date, end_date:datetime.date)->list:
'''Downloads the quotes from Yahoo finance'''
start_month = str(start_date.month-1)
start_day = str(start_date.day)
start_year = str(start_date.year)
end_month = str(end_date.month-1)
end_day = str(end_date.day)
end_year = str(end_date.year)
try:
list = []
quote = 'http://ichart.yahoo.com/table.csv?s='+ticker+'&a'+start_month+'&b='+start_day+"&c="+start_year+'&d='+end_month+'&e='+ end_day +'&f='+end_year+'&g=d'
response = urllib.request.urlopen(quote)
data = response.read()
string_data = data.decode(encoding='utf-8')
lines = string_data.splitlines()
for x in lines:
data = [y for y in x.split(',')]
list.append(data[0:5])
return list
except URLError:
print('Page not found! Please enter a valid ticker')
但结果列表是:
[['日期','打开','高','低','关闭'],['2011-10-10','26 .58','26 .97','26 .47',
'26 .94'],['2011-10-07','26 .34','26 .51','26 .20','26 .25'],['2011-10-06','25 .90',
'26 .40','25 .70','26 .34']]
应该是: ['日期','开放','高','低','关闭'],['2011-10-10','26 .58','26 .97','26 .47', '26 .94'],['2011-10-07','26 .34','26 .51','26 .20','26 .25'],['2011-10-06','25 .90', '26 .40','25 .70','26 .34']
我能以某种方式消除双重名单吗?
答案 0 :(得分:1)
这是你要找的吗?
rows = ['Date,Open,High,Low,Close,Volume,Adj Close', '2012-11-30,691.31,699.22,685.69,698.37,3163600,698.37', '2012-11-29,687.78,693.90,682.00,691.89,2776500,691.89','2012-11-28,668.01,684.91,663.89,683.67,3042000,683.67', '2012-11-27,660.17,675.00,658.00,670.71,2508700,670.71']
def format_rows(rows, gap):
split_rows = [row.split(',') for row in rows]
# Splits each row up, by comma
column_lengths = [max(col_len) for col_len in zip(*[map(len, row) for row in split_rows])]
# Finds the maximum size of each column
for row in split_rows:
col_lengths = zip(row, column_lengths)
print ''.join(col.ljust(col_length + gap, ' ') for (col, col_length) in col_lengths)
# Prints out the data, making sure there's a minimum of "gap" spaces
# between each column
执行format_rows(rows, 4)
将导致打印下表,每列之间有4个空格:
Date Open High Low Close Volume Adj Close
2012-11-30 691.31 699.22 685.69 698.37 3163600 698.37
2012-11-29 687.78 693.90 682.00 691.89 2776500 691.89
2012-11-28 668.01 684.91 663.89 683.67 3042000 683.67
2012-11-27 660.17 675.00 658.00 670.71 2508700 670.71
您可以修改代码,以便通过执行以下操作返回字符串:
def format_rows(rows, gap):
split_rows = [row.split(',') for row in rows]
# Splits each row up, by comma
column_lengths = [max(col_len) for col_len in zip(*[map(len, row) for row in split_rows])]
# Finds the maximum size of each column
output = []
for row in split_rows:
col_lengths = zip(row, column_lengths)
output.append(''.join(col.ljust(col_length + gap, ' ') for (col, col_length) in col_lengths))
return '\n'.join(output)
修改强>
如果您只想包含第一个n
行,可以使用以下功能并调用format_rows(rows, 4, 5)
。实质上,我们在打印之前将每一行截断为前五行。
def format_rows(rows, gap, limit):
split_rows = [row.split(',') for row in rows]
# Splits each row up, by comma
column_lengths = [max(col_len) for col_len in zip(*[map(len, row) for row in split_rows])]
# Finds the maximum size of each column
for row in split_rows:
col_lengths = zip(row, column_lengths)[:limit]
# Prints out only the first `limit` columns
print ''.join(col.ljust(col_length + gap, ' ') for (col, col_length) in col_lengths)
# Prints out the data, making sure there's a minimum of "gap" spaces
# between each column
答案 1 :(得分:1)
有了这个,您可以轻松自定义外观,即使它比迈克尔的解决方案“更不自动”:
lines = [x.split(',') for x in a]
for line in lines:
print "{0[0]:<10} {0[1]:<6} {0[2]:<6} {0[3]:<6} {0[4]:<6} {0[5]:<7} {0[6]:<6}".format(line)
结果:
Date Open High Low Close Volume Adj Close
2012-11-30 691.31 699.22 685.69 698.37 3163600 698.37
2012-11-29 687.78 693.90 682.00 691.89 2776500 691.89
2012-11-28 668.01 684.91 663.89 683.67 3042000 683.67
想要显示第一列中心,所有其他列右对齐,最后一列中的大间隙并省略打开列?只是格式字符串的一个小改动:
"{0[0]:^10} {0[2]:>6} {0[3]:>6} {0[4]:>6} {0[5]:>7} {0[6]:>12}"
(见format string syntax)
你得到:
Date High Low Close Volume Adj Close
2012-11-30 699.22 685.69 698.37 3163600 698.37
2012-11-29 693.90 682.00 691.89 2776500 691.89
2012-11-28 684.91 663.89 683.67 3042000 683.67
答案 2 :(得分:0)
如果您只是希望输出看起来很漂亮,那么有很多方法可以做到这一点,因为两个响应已经指出您可以很容易地做到这一点。如果您只是想要一般性,那么您的代码就像它需要的一切只需要
for x in lines:
print x
但是,如果要生成行列表,则必须执行以下操作:
lst = []
for x in lines:
data = [y for y in x.split(',')]
lst.append(data)
for x in lst:
print x
['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close']
['2012-11-30', '691.31', '699.22', '685.69', '698.37', '3163600', '698.37']
['2012-11-29', '687.78', '693.90', '682.00', '691.89', '2776500', '691.89']
['2012-11-28', '668.01', '684.91', '663.89', '683.67', '3042000', '683.67']
['2012-11-27', '660.17', '675.00', '658.00', '670.71', '2508700', '670.71']
['2012-11-26', '666.44', '667.00', '659.02', '661.15', '2204600', '661.15']
['2012-11-23', '669.97', '670.00', '666.10', '667.97', '922500', '667.97']
但是对于简单漂亮的输出,你可以让你摆脱日期,开放行并做到这一点:
print('Date Open High Low Closee Volume Adj Close')
del lines[0]
for x in lines:
data = [y for y in x.split(',')]
print("{0} {1} {2} {3} {4} {5} {6}".format(*data))
Date Open High Low Close Volume Adj Close
2012-11-30 691.31 699.22 685.69 698.37 3163600 698.37
2012-11-29 687.78 693.90 682.00 691.89 2776500 691.89
2012-11-28 668.01 684.91 663.89 683.67 3042000 683.67
2012-11-27 660.17 675.00 658.00 670.71 2508700 670.71
2012-11-26 666.44 667.00 659.02 661.15 2204600 661.15
希望这会有所帮助。虽然 LeartS 的格式是更好的最佳练习风格。