python 從SFTP下載文件


最近在做一個自動化測試工具,需要從SFTP拉下文件,用到python中paramiko模塊,進行遠程服務器的連接(至於paramiko、吧啦吧啦,網上一大堆,不懂去找度娘啦)

(1) 安裝paramiko

     本寶寶本地安裝的是python3.6,打開cmd

     將當前工作路徑切換到:C:\Local\Programs\Python\Python36-32\Lib\site-packages(就是python安裝路徑-->Lib目錄-->site-packages目錄)

     執行命令:pip install paramiko 

     剛開始如下錯誤:

     錯誤提示:ReadTimeoutError: HTTPSConnectionPool(host='pypi.python.org',port=443):Read timed out

     解決方法:在命令中添加 --default-timeout=100 延長超時時間即可。如,pip --default-timeout=100 install paramiko

     安裝完成之后,在dos中輸入python之后,import paramiko不報錯就說明安裝成功

     

 

(2)使用paramiko

       sf = paramiko.Transport(host, port)              || host是sftp服務器主機名,port是端口號

       sf.connect(username=username, password=password) || username是用戶名,password是密碼

       sftp = paramiko.SFTPClient.from_transport(sf)    || 建立連接     

(3)實現下載功能

      從sftp拉文件時,遇到的情況如下

      #1.遠程文件路徑就是某一文件的全路徑,例如:/datafile/text.txt

          sftp.get(file, local_filename)

          file是要下載的文件路徑,而 local_filename是要下載到哪個路徑下

      #2.遠程文件路徑是一個文件夾,例如:/datafile/

         針對於這一種情況,首先要遍歷得到所有的文件,這里其實剛開始我也是整暈了,不能下載文件夾,只能下載對應的文件

           這里用了遞歸的方法遍歷得到所有的文件

     def sftp_download(app, sftp, remote_dir):
all_files = list()
if remote_dir[-1] == '/':
remote_dir = remote_dir[0:-1]
files = sftp.listdir_attr(remote_dir)
for file in files:
filename = remote_dir + '/' + file.filename
if stat.S_ISDIR(file.st_mode):
all_files.extend(sftp_download(app, sftp, filename))
else:
all_files.append(filename)
return all_files
    stat.S_ISDIR(file.st_mode)這個函數是用來判斷遠程服務器上是否是文件夾(和windows還是有區別滴)
下載到本地的時候也要創建對應的文件名字呦,就是上邊提到的sftp.get()這個方法傳遞的是兩個參數。

      

     

 

     


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com