2017-01-02 93 views
1

我正在編寫一個代碼,該代碼在文本文件中查找,並查看輸入是否存在。Python - 從文本文件中查找行號

例如

我輸入「比薩」

我的文本文件包含:

bread 
pizza 
pasta 
tomato 

我想找到一種方法來打印行數字比薩餅上。任何幫助?

+1

通過[Tutorial](https://docs.python.org/3/tutorial/index.html)開始閱讀並練習示例,很快你就會開始獲得創意 - 在shell中嘗試其中的一些找出哪些可行,哪些不可行,查看[*內置函數]的文檔(https://docs.python.org/3/library/functions.html),以查看是否有任何幫助你解決了這個問題。 – wwii

回答

1
with open('test.txt') as f: 
    content = f.readlines() 

index = [x for x in range(len(content)) if 'pizza' in content[x].lower()] 

的部分(1)讀出每一行中的變量「內容」的單獨列表。

只有在該行中存在「pizza」的情況下,第(2)部分纔會填充第#行內容。 [x for x in range(len(content))]只是填充所有索引值,而content [x] .lower()中的'if'pizza'保留與該字符串匹配的行。

+0

你能提供一些解釋嗎? – Cherniv

+0

對不起,我添加了解釋 – Oxymoron88

+0

我打印了什麼,然後給我的行號?行號是什麼變量? – googlecoolcat

0
print next (i for i,v in enumerate (open (fname),1) if v == needle) 
+0

之後您不想關閉文件? –

1

實現這一點有兩種方法:

  1. 在內存中保存整個文件,所以你只能讀一次
  2. 通過在每個搜索文件閱讀,但不必存儲它

對於方法1,先在每一行讀取,然後拿到指標,這個詞是:

with open('path.txt') as f: data = f.readlines() 
line_no = data.index("pizza") 

可替代地,經過該文件以找到索引:代碼

with open('path.txt') as f: 
    for line_no, line in enumerate(f): 
     if line == "pizza": 
      break 
    else: # for loop ended => line not found 
     line_no = -1 
1

像這樣?

import re 
import os # You can go without is if you have other means to get your filepath 

i = 1 
matches = [] 
target = raw_input("Please type string to match\n") 
with open(os.getenv("SOME_PATH") + "/myfile.txt") as fic: # open("myfile.txt") if in your current directory 
    for line in fic: 
     if re.search(target, line): 
      print "Found at line {}".format(i) 
      matches.append(i) 
     i = i +1 
if not len(matches): 
    raise Exception, "target not found" 

通過這樣做,你可以輸入一個正則表達式,它應該工作(即,如果你輸入「p.zza」或「^ P。*」,它會奏效。)。列表matches將包含與輸入模式匹配的所有行的索引。