Python文本文件类

0 投票
1 回答
10169 浏览
提问于 2025-04-18 15:33

我正在处理的问题是:

开发一个名为 Textfile 的类,这个类提供一些方法来分析文本文件。Textfile 类应该有一个构造函数,接受一个文件名(字符串形式)作为输入,并创建一个与对应文本文件关联的 Textfile 对象。这个类应该支持三个方法:nchars()、nwords() 和 nlines(),分别返回字符数、单词数和行数。

这是我对这个问题的尝试:

class Textfile():
    def __init__(self, filename):
        self.file = open(filename)

    def nchars(self):
        return len(self.file.read())

    def nwords(self):
        content = self.file.read()
        words = content.split()
        return len(words)

   def nlines(self):
        content = self.file.read()
        return content.count('\n')

我的所有方法似乎都能正常工作。然而,当我连续运行两个方法时,第二个方法没有保存文本文件的内容,结果我得到的是 0。

举个例子,
假设 example.txt 的内容是:这是一个句子。

当我运行程序时,我应该得到这个结果:

>>>>x = Textfile('example.txt')
>>>>x.nchars()
>>>>19
>>>>x.nwords()
>>>>4 
>>>>x.nlines()
>>>>1

但是,我得到的是这个:

>>>>x = Textfile('example.txt')
>>>>x.nchars()
>>>>19
>>>>x.nwords()
>>>>0 
>>>>x.nlines()
>>>>0

或者这个:

>>>>x = Textfile('example.txt')
>>>>x.nwords()
>>>>4
>>>>x.nchars()
>>>>0 
>>>>x.nlines()
>>>>0

正如你所看到的,这些方法单独运行时是有效的,但在下一个方法中,文本文件的内容没有被保存。

我哪里做错了呢?

1 个回答

3

这是因为 read() 函数只能读取文件一次。当你读取文件时,它会移动到文件中的不同位置。当你执行一些操作时,可能会到达文件的末尾。为了再次读取文件,你需要关闭并重新打开它。我建议你重新设计你的初始化函数,改成这样:

def __init__(self, filename):
    with open(filename, 'r') as inputfile:
        self.content = inputfile.read() 

然后在其他地方使用内容,而不是再次调用 read。这样做可以让你的代码更灵活,也能避免程序因为意外丢失文件句柄而崩溃。

正如 @chepner 提到的,最好在你的 __init__ 函数中加入长度、计数(以及其他)属性,这样内容就不需要一直保存在内存中。这样看起来会像:

def __init__(self, filename):
    with open(filename, 'r') as inputfile:
        content = inputfile.read() 
    self.nChars = len(content)
    self.nLines = content.count('\n')
    self.nWords = len(content.split())

撰写回答