2016-12-01 10 views
2

別の問題が発生しました。このコードでは、テキストファイルから名前を削除しています。私は確かになぜ、しかし時にはそれはうまく動作し、名前を削除しませんが、非常に頻繁にはない、時間の100%を動作するこれを行うための良い方法はありますか?私はあなたがそれを必要としないので私のファイルパスとファイル名を変更しました。テキストファイルから名前を削除する

with open(r"MyFilePath\MyFile.txt","r") as file: 
     participants=[] 
     for line in file: 
      participants.append(line) 
    file.close() 
    leavingParticipant=input("Enter leaving participant: ") 
    file=open(r"MyFilePath\MyFile.txt","w") 
    for participant in participants: 
     if participant!=leavingParticipant+"\n": 
      file.write(participant) 
    file.close() 
+0

「leaveParticipant +」と関係がありますので、あなたのコードを見ているだけです。\ n "' ...サンプルデータを貼り付けることができますか? – anshanno

答えて

2
with open(r"MyFilePath\MyFile.txt","r") as file: 
    participants=[] 
    for line in file: 
     participants.append(line) 

leavingParticipant=input("Enter leaving participant: ") 

with open(r"MyFilePath\MyFile.txt","w") as file: 
    for participant in participants: 
     if leavingParticipant != participant.strip(): 
      file.write(participant) 

あなたはコンテキストマネージャで手動でファイルを閉じる(with..as文)する必要はありません。私たちが必要とする情報の周りに空白を入れようとするのではなく、単にそれを取り除いてみましょう。

+0

ありがとう、私は何をしたの多くを変更せずに治療を働いた – WhatsThePoint

2

あなたがファイルを開くたびにopen()機能は、すべての行を含むイテレータのようなオブジェクトであるファイルオブジェクトを返すので、まず、あなたはラインを読み、手動でリストに追加する必要はありません。または、キャッシュする場合はreadlines()メソッドを使用できます。

第2に、withステートメントを使用しているときにファイルを閉じる必要はありません。ブロックの最後にあるファイルを閉じるジョブの1つです。

上記の注意を念頭に置いて、ファイルを一度に読み込んで変更するために一時ファイルオブジェクトを使用するのが最適な方法があります。幸い、pythonはtempfileモジュールを提供しています。この場合、NamedTemporaryFileメソッドを使用できます。 shutil.move()を使用して、一時ファイルを現在のファイルに置き換えます。

import tempfile 
import shutil 

leavingParticipant=input("Enter leaving participant: ") 
filename = 'filename' 
with open(filename, 'rb') as inp, tempfile.NamedTemporaryFile(mode='wb', delete=False) as out: 
    for line if inp: 
     if line != leavingParticipant: 
      put.write(line) 


shutil.move(out.name, filename) 
0

コードを書き直してみましょう。最初にfileは予約語なので、オーバーロードしないことをお勧めします。次に、withを使用してファイルを開くので、.close()を使用する必要はありません。これは、with句が終了すると自動的に実行されます。参加者のリストを反復する必要はありません。リストからアイテムを削除するには、いくつかの方法があります。おそらく、ここでは.remove(item)を使用するのが最も適切でしょう。

with open(r"MyFilePath\MyFile.txt","r") as fp: 
    participants=[] 
    for line in fp: 
     participants.append(line.strip()) #remove the newline character 

leavingParticipant = input("Enter leaving participant: ") 

with open(r"MyFilePath\MyFile.txt","w") as fp2: 
    if leavingParticipant in participants: 
     participant.remove(leavingParticipant) 
    file.write('\n'.join(participant)) 
+1

@パトリック:それは間違っています。 'in'を使うと、文字列のリスト内で完全に一致するものが検索されます。リスト内の各文字列内に検索をマップしません。 – James

関連する問題