【问题标题】:Call a method from a file and parse the file从文件调用方法并解析文件
【发布时间】:2015-10-18 02:21:01
【问题描述】:

我做错了。它应该使用构造函数打开文件,并调用一个方法read_names_from_files(),该方法将解析上述每个单词的计数文件。作为空闲的例子,我运行了这个程序:

>>> import fish
>>> a = fish.Fishes("filename.txt")
>>> freqs = a.read_names_from_files()
>>> freqs
>>> {}

但它没有显示字典中的解析内容。

class Fishes:
def __init__(self, fn):
    self.file1 = open(fn, 'r')
    self.freqs=self.read_names_from_files()

def read_names_from_files(self):
    freqs = {}
    for line in self.file1:
        for word in line.split():
            if word in freqs:
                freqs[word] += 1
            else:
                freqs[word] = 1
    return freqs

【问题讨论】:

  • 尝试运行时出现:Fishes instance has no attribute fish
  • 您问题中的代码不会产生该错误,因此它必须来自创建并尝试使用该类的其他代码。请添加您的问题(以及您的评论)。
  • 为什么先初始化file1,然后在read_names_from_files中再次打开文件?
  • 只有显示实际代码才能得到有用的答案。这个问题中给出的代码充满了拼写错误(例如,Class 大写 C、freqsself.freqsslf 而不是 self),并且会导致很多错误,但绝对不会在您声称它导致的错误中。
  • 问题是,该类必须包含构造函数,并且它将通过将其作为参数打开一个文件。它应该调用一个方法 read_names_from_files() 将解析文件并将其放入字典

标签: python class constructor


【解决方案1】:

这似乎有效。抱歉,您的代码有太多错误,我无法逐一讨论,甚至无法找出导致您问题的主要原因。

class Fishes:
    def __init__(self, fn):
        self.file1 = open(fn, 'r')

    def read_names_from_files(self):
        freqs = {}
        for line in self.file1:
            for word in line.split():
                if word in freqs:
                    freqs[word] += 1
                else:
                    freqs[word] = 1
        return freqs

if __name__ == '__main__':
    import fish  # assume this file is named "fish.py"
    a = fish.Fishes("fish.py")  # read it as test data
    freqs = a.read_names_from_files()
    assert freqs['for'] == 2  # raise exception if untrue

【讨论】:

  • 如何通过def __init__(self, fn)调用函数read_names_from_files(self)?我可以这样称呼它: class Fishes: def __init__(self, fn): self.file1 = open(fn, 'r') self.read_names_from_files(self) 那么输出格式是什么?和以前一样吗?
  • 我试过这样的代码: class Fishes: def __init__(self, fn): self.file1 = open(fn, 'r') self.freqs=self.read_names_from_files() def read_names_from_files( self): freqs = {} for line in self.file1: for word in line.split(): if word in freqs: freqs[word] += 1 else: freqs[word] = 1 当我尝试运行时返回频率代码: import fish >>> a = fish.Fishes("x.txt") >>> freqs= a.read_names_from_files() >>> freqs {} 这是空字典
  • jack15:您的修改从Fishes.__init__() 调用read_names_from_files() 并将结果分配给self.freqs。当您通过freqs = a.read_names_from_files() 再次显式调用它时,该文件已被完全读取,因此没有更多行可读取,这导致它返回一个空字典。请改用freqs = a.freqs(或直接引用a.freqs,因为您对__init__() 的更改会在其中包含值)。既然我的答案有效,为什么要进行所做的更改。
猜你喜欢
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多