Python 处理数据文件时列表索引超出范围错误

Python 处理数据文件时列表索引超出范围错误,python,Python,我有一系列包含两列的数据文件,其中第一行的格式与文件的其余部分不同。我试图将这两列中的每一列都转换为它们自己的列表(忽略第一行),但我一直遇到“列表索引超出范围”错误,我不知道为什么 我的编程经验非常有限,所以很抱歉代码太乱了 file_name_pre = 'spa000' first_file = '7' last_file = '28' file_suffix = '.txt' a = int(first_file) b = int(last_file) file_num = a x_va

我有一系列包含两列的数据文件,其中第一行的格式与文件的其余部分不同。我试图将这两列中的每一列都转换为它们自己的列表(忽略第一行),但我一直遇到“列表索引超出范围”错误,我不知道为什么

我的编程经验非常有限,所以很抱歉代码太乱了

file_name_pre = 'spa000'
first_file = '7'
last_file = '28'
file_suffix = '.txt'
a = int(first_file)
b = int(last_file)
file_num = a
x_val = []
y_val = []

for i in range(a, a + 1):
    file = file_name_pre + str(file_num).zfill(2) + file_suffix
    hndl = open(str(file), 'rt')
    data = hndl.readlines()
    time = float(data[0])
    time_col.append(time)
    c = len(data)
    for j in range(1, c + 1):
        x = float(data[j].split()[0])  #error on this line
        x_val.append(x)
        y = float(data[j].split()[1])
        y_val.append(y)
hndl.close()
试着换掉这条线

for j in range(1, c + 1):
对此

for j in range(1, c):

您的数据是从索引0而不是1开始的

最有可能的
范围(1,c+1)
应为
范围(1,c)

对于范围(1,c+1)内的j,您的错误在以下行
,如果您检查,您会发现:

范围签名如下
范围(开始,停止[,步骤])
最后一个元素是最小的
start+i*步骤
大于停止。如果没有像您的情况那样指定步骤,最后一个索引将是
stop-1

c
在您的例子中是一个列表长度:
len(data)
,由于python列表是基于0索引的,所以最后一个有效索引应该是
c-1
,考虑到
范围
逻辑,您应该替换:

适用于范围(1,c+1)内的j

作者:


对于范围(1,c)内的j
以下是一种基于以下内容的替代技术:

File
File.txt

something
1. 11.
2. 22.
3. 33.
4. 44.
5. 54.
脚本:

import numpy as np

data = np.genfromtxt('file.txt', skip_header=1, usecols=(0,1), dtype=np.float32, autostrip=True)
data = np.swapaxes(data, 0, 1) # swap the axes

print data[0] # 1st line: [ 1.  2.  3.  4.  5.]
print data[1] # 2nd line: [ 11.  22.  33.  44.  54.]

这是一种清晰快速的方法,请随意使用

应该跳过第一行。好的,我将其更改为该行,但是现在对于y=float(data[j].split()[1])行,我得到了相同的错误。如果第一行应该被跳过,那么马库斯的答案是正确的是,第一行不会被跳过。第二个异常很可能意味着有行只有一列。是的。这很有效,谢谢。我的印象是,范围函数不包含结束值,您能解释一下为什么它不截断最后一行吗?例如,
range(0,3)
将生成数字0、1和2。索引从0开始,因此您的列表应该有3项。将第二个数字视为列表的长度。只要不为范围提供步长,这将起作用。