2017-08-12 100 views
1

我試圖在txt文件中搜索字符串。這是一個示例txt文件。我有工作:使用python搜索文本文件中的行

abc 
def 
ghi 
centre 
jkl 
mno 
pqr 
123 
456 

我想匹配文件中的行,如果發現匹配則退出程序,如果沒有找到匹配,則行添加到文件:

我有我正在使用的以下代碼:如果我嘗試匹配文件中的「abc」,但我說如果我嘗試匹配「pqr」,如果塊也執行,我會看到我的第二個代碼。

以下是我到目前爲止的代碼。

#!/usr/bin/python 

new_data = raw_input("Enter txt:")  
file_name = "test.txt" 

with open(file_name, "r") as F: 
    data = F.readlines() 

for num, line in enumerate(data, start=1): 
    if line.strip() == new_data: 
     print "exists {} {}".format(new_data, num) 
     break 

    if line.strip() != new_data: 
     print "new data {} to be entered into line {}".format(new_data, num) 

    else: 
     print "break" 

以下是輸出我得到,如果我嘗試匹配說「123」,從文件:

Enter txt:123 
new data 123 to be entered into line 1 
new data 123 to be entered into line 2 
new data 123 to be entered into line 3 
new data 123 to be entered into line 4 
new data 123 to be entered into line 5 
new data 123 to be entered into line 6 
new data 123 to be entered into line 7 
exists 123 8 
+0

如果線路沒有發現將在其中的新行插入? – frogcoder

回答

6

IIUC,你想,如果數據不存在第二塊只執行。那麼,試試這個:

for num, line in enumerate(data, start=1): 
    if line.strip() == new_data: 
     print "exists {} {}".format(new_data, num) 
     break 
else: 
    print "new data {} to be entered into line {}".format(new_data, num) 

你可以利用for...else的語法。如果循環不是break,即數據不存在於文件中,則執行else

+0

不錯的一個。否則有點混亂,會閱讀更多關於此的信息。 – zig

+0

@zig確實。這是一個有用的工具,也被低估了。你可以在這裏查看更多:https://docs.python.org/3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops。此外,請考慮標記如果它工作! –

1

與您的代碼的問題是,如果new_data未在迭代找到你的第二如果條件打印new data to be entered即使在隨後的迭代存在,那麼只有第一個數據abc會給期望的結果是從那裏迭代開始。

@COLDSPEED已經給出了一個很好的解決方案。

另一種基本的方法可能是這樣的:

for num, line in enumerate(data, start=1): 
    if line.strip() == new_data: 
     flag = 1 
     print("exists {} {}".format(new_data, num)) 
     break 
    else: 
     flag = 0 

if flag == 0: 
    print("new data {} to be entered into line {}".format(new_data, num)) 

它通過將整個數據和迭代如果new_data發現它將設置flag爲1,將打破,否則將設置flag到介於0和將打印new data to be entered

希望這有助於:)