在Python中从文本文件创建列表

0 投票
5 回答
3600 浏览
提问于 2025-04-16 13:20

我有一个文本文件,里面的内容大概是这样的:第一列是学生的名字,第二列是学分的数量,第三列是分数(分数乘以学时)。

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)

在这里,我使用一个循环,根据文本文件中的数据创建一个列表,把每一行的相关信息添加到这个列表里。

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

你不会看到错误信息,而是会得到一堆学生对象的列表。你需要做的是实现一个 __str__ 或者 __repr__ 方法:特殊方法名称

2

大家都说,这不是错误。你只需要在你的 Student 类里实现 __str____repr____unicode__ 方法就可以了。

不过,我有一个小建议。你应该使用 csv模块 来读取你的文件。

你的 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

4

这不是错误,而是正常的输出。你应该重写一下 __str____repr__ 这两个方法,告诉Python怎么打印 Student 类的对象。

关于你的代码,这样写会好很多:

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

撰写回答