最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現FTP文件傳輸的實例

 更新時間:2019年07月07日 11:19:28   作者:隨#心  
在本篇文章里小編給各位分享的是關于Python實現FTP文件傳輸的實例以及相關代碼,需要的朋友們學習下。

FTP一般流程

FTP對應PASV和PORT兩種訪問方式,分別為被動和主動,是針對FTP服務器端進行區(qū)分的,正常傳輸過程中21號端口用于指令傳輸,數據傳輸端口使用其他端口。

PASV:由客戶端發(fā)起數據傳輸請求,服務器端返回并攜帶數據端口,并且服務器端開始監(jiān)聽此端口等待數據,為被動模式;

PORT:客戶端監(jiān)聽端口并向服務器端發(fā)起請求,服務器端主動連接此端口進行數據傳輸,為主動模式。

其中TYPE分兩種模式,I對應二進制模式、A對應ASCII模式;

PASV為客戶端發(fā)送請求,之后227為服務器端返回操作碼表示成功,并且后面帶有服務器端監(jiān)聽的端口:143x256(左移8位)+48

之后通過STOR命令進行數據下載,下載完成后返回226表示數據傳輸完成。

2. Python代碼實現:

中文路徑問題:由于FTP支持ASCII編碼,Python ftplib中編碼方式使用latin-1,而window默認編碼方式為gbk,所以使用Python處理時需先將中文路徑編碼為gbk之后譯碼為latin-1字符;

上傳下載使用storline和retrline,對應二進制使用storbinary和retrbinary。對于stor類函數后面的參數fp表示接收一個文件對象,支持read方法,一般為打開需要上傳的源文件,而retr類函數后面的參數表示對于返回數據的處理方法。

從一個FTP服務器到另一個FTP服務器的數據傳輸:

利用本地電腦作為數據緩存,但并不將數據保存到硬盤,只在內存中存儲進行數據傳輸;其中一端作為下載一端為數據上傳。

首先登陸兩個FTP服務器,transfercmd函數用于發(fā)送命令并返回已建立好連接的本地Socket,此時分別在兩個本地Socket進行數據的收發(fā)即可。

在測試中發(fā)現,在發(fā)送完一個文件之后只有及時的關閉socket,21端口才會返回226,數據完成指示,這樣才可以循環(huán)下一個文件,在完成之后要退出FTP。

#coding=utf-8

import ftplib,os.path,os
import socket

f1=ftplib.FTP('172.16.2.76')
f2=ftplib.FTP('172.16.25.153')


class myFTP:
    path='file/download/bbb/'
    # ftplib中編碼使用latin-1
    title='版本'.encode(encoding='gbk').decode(encoding='latin-1')
    path1=path+title  
    localDir='E:\\ver\\fp\\'
    
    path2='abc/edf/'
    

    def __init__(self):
           
      try:
        f1.login('username','password')
      except ftplib.error_perm:
        print('f1 cannot loggin!')
        return

      try:
        f2.login()
      except ftplib.error_perm:
        print('f2 cannot loggin!')
        return
        
    def ftpD(self):
             
      filelist=[]
      fileLIST=[]
      filels=f1.retrlines('LIST %s'%(self.path1),callback=filelist.append)
      f1.cwd(self.path1)
      for file in filelist:
        fileAttr=file.split(' ')
        fileName=fileAttr[-1]
        fileType=fileAttr[0][0]
        if fileType=='-':
          fileLIST.append(fileName)
    
      for file in fileLIST:
        path=self.localDir+file
        f1.retrbinary('RETR %s'%(file),open(path,'wb').write)
        print('%s download.....'%(file))    
      f1.quit()
    
    def ftpU(self,fun=1):
    
      os.chdir(self.localDir)
      fileList=os.listdir()
      
      # upload file
      if fun==1:
          for file in fileList:
            path=self.path2
            f2.storbinary('STOR %s'%(path+file),open(file,'rb'))
            print('%s uploading......'%(file))
      
      #delete file
      if fun==0:
          try:
              for file in fileList:
                path=self.path2
                f2.delete(path+file)
                print('%s delete......'%(file))
          except ftplib.error_perm:
              print('no file to delete!!')
              return
      
      f2.quit()
    
    def test(self):
      
      f1.cwd(self.path1)
      f2.cwd(self.path2)
      fileList=f1.nlst()
      print(fileList)
      
      for file in fileList:
        print('transfer %s......'%(file))
        f1.voidcmd('TYPE I')
        f2.voidcmd('TYPE I')
        sock1=f1.transfercmd('RETR %s'%(file))
        sock2=f2.transfercmd('STOR %s'%(file))
    
        while 1:
      
            data=sock1.recv(1024)
            sock2.sendall(data)
            
            if len(data)==0:
              break
        # 數據發(fā)送完成后需關閉socket,服務器21端口才會有返回    
        sock1.close()
        sock2.close()
            
                          
        res1=f1.getresp()
        #print('f1 >> %s'%(res1))
        res2=f2.getresp()
        #print('f2 >> %s'%(res2))    
                   
      f1.quit()
      f2.quit()

    
if __name__=='__main__':
  ftptest=myFTP() 
  ftptest.ftpU(0)
  #ftptest.test()
  #ftptest.ftpD()

相關文章

  • Python實現五子棋人機對戰(zhàn)?和人人對戰(zhàn)

    Python實現五子棋人機對戰(zhàn)?和人人對戰(zhàn)

    這篇文章主要介紹了Python實現五子棋人機對戰(zhàn)?和人人對戰(zhàn),通過定義黑白子,落子位置以及獲勝規(guī)則展開詳細內容,需要的小伙伴可以參考一下
    2022-05-05
  • 關于numpy中矩陣的翻轉(flip)

    關于numpy中矩陣的翻轉(flip)

    這篇文章主要介紹了關于numpy中矩陣的翻轉(flip),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 使用Python進行物聯網設備的控制與數據收集

    使用Python進行物聯網設備的控制與數據收集

    Python作為一種高效且易于學習的編程語言,已經成為開發(fā)物聯網應用的首選語言之一,本文將探討如何使用Python進行物聯網設備的控制與數據收集,并提供相應的代碼示例,需要的朋友可以參考下
    2024-05-05
  • python產生模擬數據faker庫的使用詳解

    python產生模擬數據faker庫的使用詳解

    這篇文章主要介紹了python產生模擬數據faker庫的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • 如何實現一個python函數裝飾器(Decorator)

    如何實現一個python函數裝飾器(Decorator)

    這篇文章主要介紹了如何實現一個python函數裝飾器(Decorator),幫助大家更好的理解和學習python,感興趣的朋友可以了解下
    2020-10-10
  • python使用PyGame播放Midi和Mp3文件的方法

    python使用PyGame播放Midi和Mp3文件的方法

    這篇文章主要介紹了python使用PyGame播放Midi和Mp3文件的方法,涉及Python操作多媒體文件的相關技巧,需要的朋友可以參考下
    2015-04-04
  • Matplotlib animation模塊實現動態(tài)圖

    Matplotlib animation模塊實現動態(tài)圖

    這篇文章主要介紹了Matplotlib animation模塊實現動態(tài)圖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • PyCharm 接入 DeepSeek最新完整教程

    PyCharm 接入 DeepSeek最新完整教程

    文章介紹了DeepSeek-V3模型的性能提升以及如何在PyCharm中接入和使用DeepSeek進行代碼開發(fā),本文通過圖文并茂的形式給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-02-02
  • Python中層次聚類的詳細講解

    Python中層次聚類的詳細講解

    層次聚類( Hierarchical Clustering )是聚類算法的一種,通過計算不同類別的相似度類創(chuàng)建一個有層次的嵌套的樹,下面這篇文章主要給大家介紹了關于Python中層次聚類的詳細講解,需要的朋友可以參考下
    2022-12-12
  • 深入詳解Python中dotted庫的使用

    深入詳解Python中dotted庫的使用

    Python的dotted庫提供了一種便捷的方式來處理嵌套字典和列表,允許通過點分隔的路徑字符串來訪問和設置嵌套結構中的數據,下面我們就來看看它的具體使用
    2019-04-04

最新評論

聂荣县| 黎川县| 普陀区| 敖汉旗| 绩溪县| 高雄市| 西华县| 沾益县| 定安县| 江永县| 洛宁县| 天台县| 广河县| 金堂县| 江都市| 太保市| 乌拉特中旗| 简阳市| 两当县| 荔波县| 普洱| 额济纳旗| 辰溪县| 手机| 买车| 文昌市| 新乡县| 南川市| 桓台县| 梧州市| 微山县| 泉州市| 灵丘县| 上林县| 木兰县| 德保县| 黔东| 溧阳市| 应城市| 高雄县| 舒城县|