0

所以我这样做了:

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')

但结果列表是:[['Date', 'Open', 'High', 'Low', 'Close'], ['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']]

什么时候应该是:['Date', 'Open', 'High', 'Low', 'Close'], ['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']

我可以以某种方式消除双重列表吗?

4

3 回答 3

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
于 2013-10-28T21:06:40.900 回答
1

有了这个,您可以轻松地自定义外观,即使它比 Michael 的解决方案“自动化程度低”:

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}"
请参阅格式字符串语法

你得到:

   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
于 2013-10-28T21:25:11.187 回答
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的格式设置要好得多的最佳实践风格。

于 2013-10-28T21:55:01.480 回答