从python中的文本文件创建列表

时间:2011-03-09 13:41:13

标签: python list

我有一个类似于此的文本文件,其中第一列是学生的名字,第二列是学分数,第三列是分数(分数小时)。

john    5    15
bill    9    30
ted    7    22

我想创建一个提取相关信息并计算gpa的类。

class Student:

    def __init__(self, name, hours, qpoints):
        self.name = name
        self.hours = float(hours)
        self.qpoints = float(qpoints)

    def getName(self):
        return self.name

    def getHours(self):
        return self.hours

    def getQPoints(self):
        return self.qpoints

    def gps(self):
        return self.qpoints/self.hours

用于提取数据(基于每条信息之间有标签的事实)

def makeStudent(info):
    name, hours, qpoints = info.split("\t")
    return Student(name, hours, qpoints)

这里我使用for循环通过将每行的相关信息附加到列表中来基于文本文件中的数据创建列表

def readStudents(filename):
    infile = open(filename, 'r')
    students = []
    for line in infile:
        students.append(makeStudent(line))
    infile.close()
    return students

问题是我收到了这个错误:

[<__main__.Student object at 0x01FA4AD0>, <__main__.Student object at 0x01FA4AF0>,
 <__main__.Student object at 0x01FA4B10>, <__main__.Student object at 0x01FA4B50>, 
 <__main__.Student object at 0x01FA4B30>]

关于为什么会发生这种情况的任何想法?

5 个答案:

答案 0 :(得分:4)

这不是错误。这是常规输出。您应该覆盖Student类的__str____repr__方法,告诉python如何打印Student个对象。

对您的代码提供一些帮助,这要好得多:

def readStudents(filename):
    with open(filename) as student_file:
        return [Student(*line.split()) for line in student_file]

答案 1 :(得分:2)

像所有人说的那样,不是错误。只需在__str__课程上实施__repr____unicode__Student

但是,我有一个小建议。您应该使用csv module来阅读您的文件。

您的readStudents函数也可以像这样重写:

def readStudents(filename):
    students = []
    with open(filename) as infile:
        for line in csv.reader(infile, delimiter='\t'):  # or excel-tab if you want.
            students.append(Student(**line))
    return students

不是很漂亮吗?

不要忘记在python文件的开头添加import csv

答案 2 :(得分:0)

您不会收到错误,而是收到学生对象列表。您需要做的是实施__str____repr__方法:Special method names

答案 3 :(得分:0)

我强烈建议您使用csv moduleimport csv):它将为您完成大部分工作,更灵活,更易读,更不容易出错。

另外,要更严格一点:你的实际问题是什么?我只看到一些代码和一些你不明白的输出。顺便说一下,这不是错误消息,它是Student类的五个实例的列表。代码似乎按预期工作:您解析文件,创建学生,然后..?你想和他们做什么?解析完成后,您希望继续处理数据。

答案 4 :(得分:0)

Getter和setter方法通常不赞成,除非他们正在做一些活动的事情(除了检索或设置一个值之外)。

import csv

class Student(object):
    def __init__(self, name, hours, qpoints):
        super(Student,self).__init__()
        self.name    = str(name)
        self.hours   = float(hours)
        self.qpoints = float(qpoints)

    @property
    def gpa(self):
        return self.qpoints/self.hours

    @gpa.setter
    def gpa(self, value):
        raise SyntaxError('gpa property is read-only; update .qpoints or .hours instead')

    def __str__(self):
        return "{name:20} {hours:>6.2f} {qpoints:>6.2f} {gpa:>6.2f}".format(name=self.name, hours=self.hours, qpoints=self.qpoints, gpa=self.gpa)

def loadStudents(fname, *args, **kwargs):
    with open(fname) as inf:
        return [Student(*line) for line in csv.reader(inf, *args, **kwargs)]

def main():
    students = loadStudents('students.csv', delimiter='\t')
    for s in students:
        print s

if __name__=="__main__":
    main()

结果

john                   5.00  15.00   3.00
bill                   9.00  30.00   3.33
ted                    7.00  22.00   3.14