2017-03-02 42 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")組成的單元素列表。相反,您應該在初始化過程中(或者在函數的開始階段)將self.gg設置爲空列表,然後改爲self.gg.append(line.strip("\n"))

+0

謝謝您的解釋!完美的作品 –

+0

您也可以使用我在近期內存中寫入的最醜陋的單行命令:'self.gg = [line.strip(「\ n」)for open in line(「usercheck.txt」)if no any exc in line for exc in map(str.rstrip,open(「user.txt」,「r」)))]' –

+0

感謝您的建議哈哈。我想我會失去所有事情的蹤跡。 –

1

問題是,你正在構建一個self.gg列表只有一個元素:

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

旁白:

  • 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完全無處不在,你能避免一些更多的處理結果相同(直接使用字符串列表,而不是建立一個少了一份和傾倒回來加入換行的)
+0

RE:nitpicking listcomp vs genexp,我寧願看到格式化%s this「%」like「'格式化{」this。「格式化(」like「)' 。無論哪種方式,雖然...... –

+0

是的格式就是這樣。編輯。 –

相關問題