2017-04-06 165 views
-1

我希望你很好。Python:從另一個txt文件中刪除一個txt文件的元素

我有兩個TXT文件:data.txt中和to_remove.txt

data.txt中有許多行,每行有幾個整數之間若有空隙。 data.txt中的一行如下所示:1001 1229 19910

to_remove.txt有許多行,每行有一個整數。 to_remove.txt中的一行如下所示:1229

我想寫一個新的txt文件,其中包含data.txt,而不包含to_remove.txt中的整數 我知道每行data.txt的第一個元素是沒有任何to_remove.txt的元素;所以我需要檢查每個行的所有非第一個元素與每個整數to_remove.txt

我寫信給代碼做到這一點,但我的代碼太慢了。 data.txt有超過一百萬行,而to_remove.txt有幾十行

如果你能建議更快的方法來做到這一點,這將是有用的。

這裏是我的代碼:

with open('new.txt', 'w') as new: 
    with open('data.txt') as data: 
     for line in data: 
      connections = [] 
      currentline = line.split(" ") 
      for i in xrange(len(currentline)-2): 
       n = int(currentline[i+1]) 
       connections.append(n) 
      with open('to_remove.txt') as to_remove: 
       for ID in to_remove: 
        ID = int(ID) 
        if ID in connections: 
         connections.remove(ID) 
      d = '%d ' 
      connections.insert(0,int(currentline[0])) 
      for j in xrange(len(connections)-1): 
       d = d + '%d ' 
      new.write((d % tuple(connections) + '\n')) 
+0

只是一個快速的評論:你不需要複製當前行,也不需要爲你正在處理的每一行再次讀取「to_remove」文件(在開始時將它存儲在內存中一次)。 –

回答

-1

我使用的一些問題的答案代碼開發的代碼來回答我的問題,並以問題的意見建議。

def return_nums_remove(): 
    with open('to_remove.txt') as to_remove: 
     nums_to_remove = {item.strip() for item in to_remove} 
    return nums_to_remove 
with open('data.txt') as data, open('new.txt', 'w') as new: 
    nums_to_remove = return_nums_remove() 
    for line in data: 
     numbers = line.rstrip().split() 
     for n in numbers: 
      if n in nums_to_remove: 
       numbers.remove(n) 
     if len(numbers) > 1: 
      s = '%s ' 
      for j in xrange(len(numbers)-1): 
       s = s + '%s ' 
      new.write((s % tuple(numbers) + '\n'))