2014-11-04 103 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 
相关问题