2016-04-19 658 views
0

我打算創建一個python腳本來計算每個字母在文本文件中出現的次數。因此,如果該文本文件包含Hi there,輸出會像計算一個字母在python中出現在文本文件中的次數

E is shown 2 times 
H is shown 2 times 
I is shown 1 time 
R is shown 1 time 
T is shown 1 time 

我試圖獲取此不同的方式,但我正在顯示沒有輸出爲我進行越來越語法錯誤。我試過以下

import collections 
import string 

def count_letters(example.txt, case_sensitive=False): 
    with open(example.txt, 'r') as f: 
     original_text = f.read() 
    if case_sensitive: 
     alphabet = string.ascii_letters 
     text = original_text 
    else: 
     alphabet = string.ascii_lowercase 
     text = original_text.lower() 
    alphabet_set = set(alphabet) 
     counts = collections.Counter(c for c in text if c in alphabet_set) 

    for letter in alphabet: 

     print(letter, counts[letter]) 
    print("total:", sum(counts.values())) 

    return counts 

而且

def count_letters(example.txt, case_sensitive=False): 
    alphabet = "abcdefghijlkmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ" 
    with open(example.txt, 'r') as f: 
     text = f.read() 
    if not case_sensitive: 
     alpahbet = alphabet[:26] 
     text = text.lower() 
     letter_count = {ltr: 0 for ltr in alphabet} 
    for char in text: 
     if char in alphabet: 
      letter_count[char] += 1 
    for key in sorted(letter_count): 
     print(key, letter_count[key]) 
    print("total", sum(letter_count())) 
+0

我認爲你有** count **賦值的縮進問題。 – vmonteco

+0

@vmonteco腳本? – smitthy

+0

它顯示的語法錯誤是什麼? –

回答

1

在運行腳本時發現了一些問題。 @Priyansh Goel在他的回答中正確找到了一個:你不能使用example.txt作爲參數。您應該只選擇一個變量名稱,如text_file,當您調用該函數時,將傳入該文件名稱的字符串。

此外還有一個或兩個縮進錯誤。這是我開始工作的腳本:

import collections 
import string 

def count_letters(text_file, case_sensitive=False): 
    with open(text_file, 'r') as f: 
     original_text = f.read() 
    if case_sensitive: 
     alphabet = string.ascii_letters 
     text = original_text 
    else: 
     alphabet = string.ascii_lowercase 
     text = original_text.lower() 
     alphabet_set = set(alphabet) 
     counts = collections.Counter(c for c in text if c in alphabet_set) 

    for letter in alphabet: 
     print(letter, counts[letter]) 

    print("total:", sum(counts.values())) 

    return counts 

count_letters("example.txt") 

如果您將只使用於"example.txt",剛剛擺脫的第一個參數和硬編碼的文件名到函數的:

def count_letters(case_sensitive=False): 
    with open("example.txt", 'r') as f: 
     ... 

count_letters() 

一作爲一名程序員你可以開發的最好的技能是學習閱讀和理解拋出的錯誤。它們並不意味着可怕或令人沮喪(雖然有時候它們是),但它們本意是有幫助的。像你所擁有的語法錯誤特別有用。如果這些錯誤並不完全清楚,請將錯誤複製並粘貼到Google搜索中,而且往往會發現問題的答案已經存在。

祝你好運!對於你的(可能是)第一語言,Python是一個很好的選擇!

+0

'example.txt'是包含'Hi there'的文件 – smitthy

+0

文件包含的內容並不重要,但是您試圖使用'example.txt'作爲參數的事實是錯誤的。如果你只使用那一個文本文件,並且永遠不想在另一個文本文件上運行你的函數,只要把它放在函數的參數之外,然後在你的函數中引用字符串「example.txt」 '開放......'塊。如果您希望能夠從其他文本文件讀取,請將您的參數名稱更改爲'text_file'(或任何您想調用它的名稱),並確保在調用該函數時包含該字符串。 – bobbyz

+0

我該如何改變它,以便它只顯示文本文件中的字母? – smitthy

-1

在你的函數你不能有作爲example.txt的參數名稱。

以下代碼僅遍歷文本的字母而不是整個字母集。我使用字典來存儲字母的頻率。使用isalpha,以便我們只是在字典中放置字母。

import collections 
import string 

def count_letters(textfile, case_sensitive=False): 
    with open(textfile, 'r') as f: 
     original_text = f.read() 
     if case_sensitive: 

      text = original_text 
     else: 

      text = original_text.lower() 

     p = dict() 

     for i in text: 
      if i in p.keys(): 
       p[i] += 1 
      elif i.isalpha(): 
       p[i] = 1; 

     keys = p.keys() 

     for k in keys: 
      print str(k) + " " + str(p[k]) 


count_letters("example.txt") 
+0

example.txt是包含'Hi there'的文件名 – smitthy

+0

是的但你無法將其作爲參數傳遞。你可以做的是將文件的名稱作爲字符串傳遞。然後在函數內部使用它。 –

+0

我已經使用上面的答案中顯示的示例,它的工作原理,但它貫穿所有的字母表,我只想要顯示文本文件中的字母 – smitthy

相關問題