2017-08-12 16 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

new data to be entered

希望を印刷するのだろうか? – 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構文を利用できます。 elseは、ループがbreakでなければ、すなわちデータがファイルに存在しない場合に実行される。

+0

いいです。それ以外はもう少し混乱して、これについてもう少し詳しくお読みください。 – zig

+0

@zig確かに。これは有用なツールであり、過小評価されています。こちらをご覧ください:https://docs.python.org/3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loopsまた、動作すれば受け入れ可能なマークを付けてください! –

1

コードに問題が条件プリントnew data to be entered場合new_dataが反復で2回目の自分を発見していない場合には、後続の反復で存在しても反復がそこから始まるように、第1データabcのみ所望の結果を与えるということです。

すでに良い解決策の1つは@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なるとラインが改行される場所が挿入されて見つからない場合は、このヘルプ:)

関連する問題