Python IndexError: 列表索引超出范围。

5

我试图让Python填充500只股票的收盘价列表。虽然代码在处理少量股票时似乎运行良好,但大量股票会导致问题。Python不断给我报错:" OneClose.append(Data[i][4]) IndexError: list index out of range." 我不知道如何解决这个问题。无论我在范围字段中输入什么(在此示例中为31),错误仍然存在。

raw = open('C:\Model\Stocks\list.txt', 'r').read()
stocks = raw.split('\n')

for stock in stocks:
    Data = ystockquote.get_historical_prices(stock, '20120501', '20120716')

# Create empty lists, quick and dirty
    OneClose = [ ]
    OneDate = [ ]

# Populate lists from downloaded data
    for i in range(1, 31):
        OneDate.append(Data[i][0])
        OneClose.append(Data[i][4])

Data 包含以下内容:

Data = [['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Clos'], 
        ['2012-07-13', '86.32', '87.83', '86.32', '87.54', '1937700', '87.5'], 
        ['2012-07-13', '86.32', '87.83', '86.32', '87.59', '2599300', '87.5'], 
        ['2012-07-12', '86.60', '86.97', '85.34', '86.41', '4938300', '86.4'], 
        ['2012-07-11', '88.38', '88.76', '87.01', '87.85', '4208600', '87.8'], 
        ['2012-07-10', '89.08', '89.82', '87.96', '88.25', '3356800', '88.2'], 
        ['2012-07-09', '88.86', '89.08', '88.31', '88.96', '2600900', '88.9'], 
        ['2012-07-06', '88.81', '89.38', '88.35', '88.99', '2192900', '88.9'], 
        ['2012-07-05', '89.20', '89.95', '88.86', '89.57', '1924800', '89.5'], 
        ['2012-07-03', '89.11', '89.75', '89.08', '89.70', '1410400', '89.7'], 
        ['2012-07-02', '89.29', '89.69', '88.28', '89.28', '2289700', '89.2'], 
        ['2012-06-29', '88.62', '89.60', '88.35', '89.60', '4629400', '89.6'], 
        ['2012-06-28', '86.36', '87.25', '85.98', '87.16', '3267100', '87.1'], 
        ['2012-06-27', '86.39', '87.60', '86.24', '87.16', '2887800', '87.1'], 
        ['2012-06-26', '85.91', '86.47', '85.29', '86.18', '2389100', '86.1'], 
        ['2012-06-25', '85.87', '86.31', '85.46', '85.85', '2908900', '85.8'], 
        ['2012-06-22', '87.11', '87.14', '86.38', '86.83', '3026000', '86.8'], 
        ['2012-06-21', '88.04', '88.38', '86.62', '86.73', '3722800', '86.7'], 
        ['2012-06-20', '87.93', '88.28', '87.35', '87.54', '3446800', '87.5'], 
        ['2012-06-19', '87.82', '88.17', '87.52', '87.82', '3212500', '87.8'], 
        ['2012-06-18', '87.07', '87.61', '86.67', '87.31', '2950600', '87.3'], 
        ['2012-06-15', '87.57', '87.91', '87.01', '87.44', '4696100', '87.4'], 
        ['2012-06-14', '86.31', '87.23', '86.06', '86.86', '3334900', '86.8'], 
        ['2012-06-13', '86.30', '86.80', '85.72', '86.13', '3370500', '86.1'], 
        ['2012-06-12', '85.67', '86.74', '85.22', '86.73', '2570900', '86.7'], 
        ['2012-06-11', '86.54', '86.54', '85.08', '85.18', '2098200', '85.1'], 
        ['2012-06-08', '85.18', '86.09', '84.99', '86.00', '2146200', '86.0'], 
        ['2012-06-07', '85.59', '86.19', '85.33', '85.50', '3032400', '85.5'], 
        ['2012-06-06', '83.22', '84.64', '83.03', '84.63', '2776300', '84.6'], 
        ['2012-06-05', '82.59', '82.86', '82.25', '82.51', '3268700', '82.5'], 
        ['2012-06-04', '82.79', '82.99', '81.99', '82.62', '2899900', '82.6'], 
        ['2012-06-01', '83.05', '83.98', '82.72', '82.85', '3539200', '82.8'], 
        ['2012-05-31', '84.45', '85.05', '83.87', '84.41', '3683200', '84.4'], 
        ['2012-05-30', '85.06', '85.12', '84.10', '84.45', '2697100', '84.4'], 
        ['2012-05-29', '85.38', '86.00', '85.13', '85.73', '2142200', '85.7'], 
        ['2012-05-25', '84.87', '85.20', '84.40', '84.78', '2346000', '84.7'], 
        ['2012-05-24', '84.96', '85.00', '84.03', '84.98', '2322100', '84.9'], 
        ['2012-05-23', '83.37', '84.88', '82.95', '84.80', '3200000', '84.8'], 
        ['2012-05-22', '84.69', '84.99', '83.68', '84.13', '3000900', '84.1'],
        ['2012-05-21', '83.88', '84.63', '83.75', '84.46', '2450000', '84.4'],
        ['2012-05-18', '84.78', '84.78', '83.27', '83.51', '3602900', '83.5'],
        ['2012-05-17', '85.56', '85.64', '84.25', '84.34', '2777200', '84.3'],
        ['2012-05-16', '85.91', '86.27', '85.26', '85.35', '2770600', '85.3'],
        ['2012-05-15', '85.95', '86.46', '85.50', '85.78', '2611300', '85.1'],
        ['2012-05-14', '85.46', '86.55', '85.24', '85.83', '2631900', '85.2'],
        ['2012-05-11', '86.47', '87.48', '86.24', '86.73', '2601800', '86.1'],
        ['2012-05-10', '87.14', '87.69', '86.88', '87.13', '2828500', '86.5'],
        ['2012-05-09', '86.64', '87.84', '85.98', '87.27', '3192800', '86.6'],
        ['2012-05-08', '87.12', '87.88', '86.30', '87.56', '2710400', '86.9'],
        ['2012-05-07', '87.70', '88.62', '87.70', '88.01', '2753500', '87.4'],
        ['2012-05-04', '89.17', '89.24', '88.30', '88.67', '2823800', '88.0'],
        ['2012-05-03', '89.50', '89.85', '89.11', '89.39', '2343600', '88.7'],
        ['2012-05-02', '89.16', '89.59', '88.89', '89.52', '2100200', '88.9'],
        ['2012-05-01', '89.13', '89.95', '88.74', '89.60', '2294200', '88.9']
      ]

这份数据没有显示任何错误!是吗?错误可能在不同的数据集中(来自“for stock in stocks:”的不同迭代)。 - Dr. S
4个回答

5

替换:

for i in range(1, 31):

使用:

for d in Data[1:31]: #since you have range(1,31). Do Data[1:] if you just want to skip the first
    OneDate.append(d[0])
    OneClose.append(d[4])

Data数组的索引少于31个时,通常会发生这种情况。同时确保d数组至少有5个元素,否则d[4]也会产生类似的错误。使用:

if len(d) >= 5:  #check first.
    OneDate.append(d[0])
    OneClose.append(d[4])

1
@user1526586:请编辑您的问题并输入“Data”的值。 - UltraInstinct
不好意思,我不能发布这个模块,因为需要下半部分才能查看。 - user1526586
@user1526586 你应该在帖子中发布“data”的内容,这将使问题更加清晰明了。 - Ashwini Chaudhary
基本上,我正在获取几只股票的收盘价,但并非全部,因为程序会提前结束。 - user1526586
它在2021年仍然有用! - Khalid Lakhani
显示剩余6条评论

-1

Data 的其中一个元素少于 5 个项目。

您的代码有

OneDate.append(Data[i][0])
OneClose.append(Data[i][4])

而且,异常在第二行。所以,你可以确定在位置i中绝对存在一个元素在Data中(因为如果不存在,异常会在第一行出现)。

所以,错误是因为Data[i]没有5个元素。(例如,如果Data[i]是一个字符串,则其中的字符数少于5个)。

你的解决方案可能是在尝试读取它们之前检查Data[i]的长度并确保它有足够的元素。


-1

Data[i][4] 可能会发生两种情况:

  • 列表 Data 在位置 i 上没有元素。
  • 列表 Data[i] 在位置 4 上没有元素。

在这两种情况下,Python 会引发 IndexError。您是否已经检查过数据的有效性,并且上述情况不会发生?

可能是您的文本文件中缺少数据,导致 ystockquote.get_historical_prices 无法创建符合预期格式的列表。


-2

当代码触发并交换数据更新时,就会出现此错误。换句话说,当数据在每5、10或60分钟的收盘柱时刻更新时,实时更新中会有毫秒级别的间隔,因此在那个毫秒级时间段内列表将为空。这就是导致此错误的原因。


兄弟,你到底在说什么啊? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接