Python 如何解决';列表索引超出范围';

Python 如何解决';列表索引超出范围';,python,Python,我一直在试图找出这个错误,但我不能。我试图使用一个变量从文本文件中逐行读取代码,以便在需要时可以访问特定的行 Classroom = input("What classrooms results do you want to see? classone, classtwo or classthree?") Class = open(Classroom +".txt", "r") lineno = 0 name = Class.readlines()[lineno] print(name) lin

我一直在试图找出这个错误,但我不能。我试图使用一个变量从文本文件中逐行读取代码,以便在需要时可以访问特定的行

Classroom = input("What classrooms results do you want to see? classone, classtwo or classthree?")
Class = open(Classroom +".txt", "r")
lineno = 0
name = Class.readlines()[lineno]
print(name)
lineno += 1

a = Class.readlines()[lineno]
print(a)
lineno += 1

b = Class.readlines()[lineno]
print(b)
lineno += 1

c = Class.readlines()[lineno]
print(c)
lineno += 1
这是一个文本文件,它是:

Patrick
6
6
7
James
7
7
7
Tom
5
9
8
Florence
4
9
3
Hannah
2
2
1
如何克服该错误?

不要使用readlines(),因为当它们在一个数组中时,很难将它们分开。而是使用循环函数,并使用read()分别读取每一行。使用:


尽量不要使用像class这样的关键字(尽管您使用过class)。

readlines
将一直读取到文件末尾。第二个电话不会给你任何数据

无需使用
读线
。只需迭代文件本身

with open(classroom + '.txt') as classdata:
    for line in classdata:
        print(line)
你可能想读书


输入文件的布局不清晰。来自其他用户的编辑可能是错误的,也可能不是错误的。我假设如下

Patrick 6 6 7 
James 7 7 7 
Tom 5 9 8
如果要在空白处拆分每一行,只需使用并打印各个元素

with open(classroom + '.txt') as classdata:
    for line in classdata:
        for value in line.split():
            print(line)

首先,数据文件的解析顺序不是最好的,不需要每个教室都有单独的文件。只需将教室名称作为列包含在一个数据文件中。让测试在每列中排列一个。我更喜欢在csv文件中使用或|,因为在现实世界中我几乎看不到以空格分隔的文件

class,student,a,b,c
one,Patrick,6,6,7
one,James,7,7,7
one,Tom,5,9,8
one,Florence,4,9,3
one,Hannah,2,2,1
好了,现在我们有了一个规范化的csv文件,让我们使用csv模块来解析它

import csv
results = []
with open("classone.txt", "r") as classroom:
    reader = csv.DictReader(classroom, delimiter=',')
    col = reader.fieldnames
    reader.next()
    for row in reader:
        results.append([row['class'], row['student'], row['a'], row['b'], row['c']])
数据现在加载到一个列表中,在col变量中有每个内部列表的标题。现在,这肯定不是获取数据的最佳方式(对于大型数据集,我使用pandas库),但对于快速而肮脏的访问,您可以这样做

classroom = input("What classrooms results do you want to see? one, two or three?")
for row in results:
    if row[col.index('class')] == classroom:
        print row

然后,您可以在col.index()调用中使用diff col name来访问所需的各种数据位。

为什么要多次使用
readlines()
,并期望这样做会起作用?请参阅,例如,请解释输入文件的布局。在我的回答中,我假设每个学生一行。
readlines
一直读到文件的末尾。对类中的行使用
:print(line)
是个坏名字。谢谢链接到。这是我坚持了一段时间的哲学(我经常需要读取任意大的日志文件,有时需要读取任意大小的文件,如果日志旋转设置不正确的话),两者都给了我一些弹药来支持我的方法和解决方法。然后对@johnrsharpe大声呼喊!谢谢
import csv
results = []
with open("classone.txt", "r") as classroom:
    reader = csv.DictReader(classroom, delimiter=',')
    col = reader.fieldnames
    reader.next()
    for row in reader:
        results.append([row['class'], row['student'], row['a'], row['b'], row['c']])
classroom = input("What classrooms results do you want to see? one, two or three?")
for row in results:
    if row[col.index('class')] == classroom:
        print row