Python文本文件类
我正在处理的问题是:
开发一个名为 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())