2014-11-04 99 views
1

我使用Paramiko通過sftp打開遠程文件。遠程文件有一個短語列表,我想循環遍歷文件的每一行,以查看給定的短語是否與遠程文件中的某一個匹配。回到sftp遠程文件的開始

代碼用來獲取遠程文件:

self.ssh = paramiko.SSHClient() 
    self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    self.ssh.connect(host, username=username, password=password) 

    self.sftp_client = self.ssh.open_sftp() 
    self.remote_file = self.sftp_client.open(remote_file_path, mode='rb') 

def checkSubnet(self, phrase): 
    found = 0 
     for line in self.remote_file: 
      if phrase in line: 
       found = 1 
       print "FOUND IT" 
       break 
    return found 

這將爲匹配的第一個詞的工作,但是如果要匹配的下一個短語是前一個文件之前,那麼就不會找到它。我已經調試過這個for循環,從之前在最後一場比賽中打破的地方開始。我的理解是它會在文件的頂部重新開始。

有沒有辦法改變這種行爲?或者甚至是一個更好的方法。該文件中有大約97,000個短語,並且每天都在更改,因此保留本地版本是不可能的。

感謝

+0

嘗試堅持一個'self.remote_file.seek(0)'前'爲'循環回到開始。作爲一個附註,你可能應該以文本模式('mode ='r'')打開文件,而不是二進制文件,因爲你正在逐行讀取文件。從更大的角度來看,如果文件不是太大,可以考慮將整個內容讀入內存(無論是作爲一行數組還是一些解析的格式)以避免重複檢索。 – 2014-11-04 21:47:03

+0

@AndrewMedico完美,謝謝!隨時發佈一個答案,我會接受它。 – DJDMorrison 2014-11-04 22:39:06

回答

1

放一個seek(0)呼叫for循環回到文件開始之前:

def checkSubnet(self, phrase): 
    found = 0 

    self.remote_file.seek(0) 

    for line in self.remote_file: 
     if phrase in line: 
      found = 1 
      print "FOUND IT" 
      break 

    return found 
相關問題