2017-04-26 101 views
-4

我想實現一個名爲CharCounter的迭代器類。這個類打開一個文本文件並提供一個迭代器,該文件返回包含用戶指定數量字符的文本文件中的單詞。它應該每行輸出一個字。不是它在做什麼,而是將這些單詞作爲一個列表輸出,然後不斷輸出'a'。我如何修復我的代碼?修復Python代碼

class CharCounter(object): 
    def __init__(self, fileNm, strlen): 
     self._fileNm = fileNm 
     self._strlen = strlen 
     fw = open(fileNm) 
     text = fw.read() 

     lines = text.split("\n") 
     words = [] 
     pwords =[] 

     for each in lines: 
      words += each.split(" ") 

     chkEnd = ["'",'"',",",".",")","("] 
     if words[-1] in chkEnd: 
      words = words.rstrip() 

     for each in words: 
      if len(each) == strlen: 
       pwords.append(each) 

     print(pwords) 

    def __iter__(self): 
     return CharCounterIterator(self._fileNm) 

class CharCounterIterator(object): 
    def __init__(self,fileNm): 
     self._fileNm = fileNm 
     self._index = 0 

    def __iter__(self): 
     return self 

    def next(self): 
     try: 
      ret = self._fileNm[self._index] 
      return ret 
     except IndexError: 
      raise StopIteration 

if __name__=="__main__": 
    for word in CharCounter('agency.txt',11): 
     print "%s" %word 
+1

請改用https://codereview.stackexchange.com/。我懷疑有人會幫助你。 – hspandher

+0

那麼你的代碼有什麼問題 – depperm

+2

「修復」和「改善」是非常不同的。 「修復」意味着「修復不起作用的代碼」,或者「使錯誤的代碼正常工作」,但「改進」是「使得工作正常,代碼工作更好」。 – ForceBru

回答

0

張貼在SO上的代碼不應讀取文件,除非問題是關於讀取文件。結果不能被複制和驗證。 (請參閱MCVE。)相反,請將文本字符串定義爲文件的替代品。

您的代碼打印長度爲n的單詞作爲列表,因爲這是您要求它與print(pwords)一起完成的操作。它重複打印文件名的第一個字符,因爲這就是您要求它在__next__方法中執行的操作。

您的班級__init__確實比您描述的要多。試圖從文字中去掉標點符號並不會做任何事情。下面的代碼定義了一個將文本轉換爲剝離單詞列表的類(帶有重複項)。它還定義了一個過濾單詞列表的參數化生成器方法。

class Words: 
    def __init__(self, text): 
     self.words = words = [] 
     for line in text.split('\n'): 
      for word in line.split(): 
       words.append(word.strip(""",'."?!()[]{}*$#""")) 
    def iter_n(self, n): 
     for word in self.words: 
      if len(word) == n: 
       yield word 

# Test 
text = """ 
It should output a word per line. 
Which is not what's it's doing! 
(It outputs the words as a [list] and then continuously outputs 'a'.) 
How can I fix my #*!code? 
""" 
words = Words(text) 
for word in words.iter_n(5): 
    print(word) 

# Prints 
Which 
doing 
words