2016-09-10 153 views
2

試圖在python中構建一個搜索功能,該功能從用戶處獲取輸入值/字符串,搜索外部文件,然後返回總計數)該文件中的請求值。Python:在文件中搜索特定字符串並輸出總字符串數

if user_search_method == 1: 
with open("file.txt", 'r') as searchfile: 
    for word in searchfile: 
     word = word.lower() 
     total = 0 
     if user_search_value in word.split(): 
      total += word.count(user_search_value) 
      print total 

當我運行這個,雖然我得到一個行由行計數顯示,而不是總和。當我合計這些線時,它們總是比實際少1個數。

+4

你需要你的'print'聲明在同一「for」語句的縮進級別。我通常也希望調用readlines()。你的意思是說最後的計數是一個短數,還是計數的行數? – Andrew

回答

2

您在每次迭代中打印total時,必須將其從for循環中取出。你也可以做這個工作更Python,使用一臺發電機的表達:

if user_search_method == 1: 
    with open("file.txt") as searchfile: 
     total = sum(line.lower().split().count(user_search_value) for line in searchfile) 
    print total 
+0

不會破壞發電機 - 不止一條線路 - 更清晰嗎? – boardrider

+0

@boardrider沒有,因爲它只有一個循環。 – Kasramvd

+0

考慮到OP的Python級別,我不確定他們能否輕鬆掌握複雜生成器的含義。 似乎Python中的幾行支持我的斷言。 – boardrider

-1
if user_search_method == 1:  
    total = 0  
    with open('file.txt') as f: 
    for line in f: 
     total += line.casefold().split().count(user_search_value.casefold()) 
    print(total) 

這是你想要的大概是什麼做的。

0

感覺就像有可能是一些從你的問題不見了,但我會努力讓你在那裏,似乎你想要去的......

user_search_value = 'test'      # adding this for completeness of 
               # this example 
if user_search_method == 1: 
    with open("file.txt", 'r') as searchfile: 
     total = 0 
     for word in searchfile: 
      words = word.lower().split()  # breaking the words out, upfront, seems 
               # more efficient 

      if user_search_value in words: 
       total += words.count(user_search_value) 
     print total       # the print total statement should be outside the for loop