2017-03-02 14 views
0

ユーザーのリストをネットワークドライブ上のファイルに保存しようとしていて、ユーザーがプログラムを終了したときにその名前をテキストファイルから削除しようとしています。私がそれを実行するたびに、リストの最後の名前だけがファイルに保存されます。ここで私は、この関数は、ユーザ名が何であるかを決定することだけであるフィルターされたリストの内容をテキスト文書に保存する方法

def move_offline(self): 
    with open("usercheck.txt", "r") as self.text, open("user.txt", "r") as exc: 
     exclusions = [line.rstrip('\n') for line in exc] 
     for line in self.text: 
      if not any(exclusion in line for exclusion in exclusions): 
       #print (line) 
       self.gg = [line.strip("\n")] 
       print (self.gg) 

を試してきたものであり、それはネットワークファイル

def actmov(self): 
    try: 
     mmm = open("usercheck.txt","w") 
     mmm.writelines(["%s\n"%item for item in self.gg]) 
    except AttributeError: 
     print ("Oops, something didnt save correctly!") 

上のファイルに存在している場合は、よりエレガントな解決策を持っている場合はどのここに示されているアプローチとはまったく異なります。私はそれらを見るのが楽しいです!

+0

をいくつかのより多くの処理を避けることができ@ Jean-FrançoisFabreactmov関数は、プログラムを閉じると一度だけ実行されます –

答えて

1
self.gg = [line.strip("\n")] 

これは問題です。 self.ggを設定しているすべての反復は、line.strip("\n")で構成される1つの要素のリストになります。代わりに、self.ggを初期化中(またはおそらく関数の先頭にある)どこかに空のリストに設定してから、代わりにself.gg.append(line.strip("\n"))を実行する必要があります。

self.gg = [line.strip("\n")] 

余談:

+0

説明ありがとうございます!完全に動作する –

+0

最近のメモリで書いた醜い1ライナーを使うこともできます: 'self.gg = [line.strip(" \ n ")for line in open(" usercheck.txt ") exc。マップのexc(str.rstrip、open( "user.txt"、 "r"))) ') –

+0

提案のおかげでありがとう。私はすべてが何をするのか分かりません。 –

1

問題は、あなたが唯一の要素でself.ggリストを構築しているということです

  • mmm.writelines(["%s\n"%item for item in self.gg])mmm.writelines("{}\n".format(item) for item in self.gg)可能性があり、リストを作成する必要は、ちょうどgencompを渡しません〜writelines
  • 除外のための集合理解を作成することで、検索で大幅なパフォーマンスの向上が期待できます(多くのユーザーがいる場合):exclusions = {line.rstrip('\n') for line in exc}
  • あなたはまた、完全にどこでもrstripをドロップすることを決定することができ、あなたが(代わりに、直接取り除か1を構築し、改行を追加し、それをバックダンプの文字列のリストを使用)と同じ結果と
+0

RE:nitpicking listcompとgenexpの間で、私はむしろ "%"を "" "" 。いずれにせよ、... –

+0

はいフォーマットは方法です。編集。 –

関連する問題