python 進行ftp伺服器和sftp伺服器連線

2022-06-29 22:39:13 字數 4294 閱讀 7026

最近接到乙個任務,需要寫乙個python指令碼,從客戶公司的伺服器拉取存放到我們公司的sftp伺服器。

由於沒頭沒腦,所以我採用無限遍歷,將對方伺服器中檔案的路徑原原本本的複製到我們公司的伺服器。、

後來發現對方資料量過於龐大,所以決定將路徑分別存放到多個csv中,csv就充當了資料庫

流程圖

剛開始寫的是這樣乙個版本,後來因為執行到一半的時候,由於ftp連線斷掉,指令碼丟擲異常停了,重頭開始需要很多時間,所以後來又做了斷點續傳

import time

from ftplib import ftp

import os

import csv

"""1.操作日誌

2."""

data_num = 1

class ftp_op(object):

def __init__(self, host, username, password, port):

"""初始化ftp

:param host: ftp主機ip

:param username: ftp使用者名稱

:param password: ftp密碼

:param port: ftp埠 (預設21)

"""self.host = host

self.username = username

self.password = password

self.port = port

self.csv = none

def ftp_connect(self):

"""連線ftp

:return:

"""ftp = ftp()

ftp.set_debuglevel(0) # 不開啟除錯模式

ftp.connect(host=self.host, port=self.port) # 連線ftp

ftp.login(self.username, self.password) # 登入ftp

return ftp

def download_file(self, dst_file_path ):

""":param dst_file_path: 本地存放路徑

:return:

"""ftp = self.ftp_connect()

print(ftp.getwelcome() ) #顯示登入ftp資訊

ftp.cwd("ftpstufgap")

for dir in ftp_file_path:

ftp.cwd(dir)

for file_name in ftp.nlst(ftp.pwd()):

self.judge_file_dir(ftp, file_name, dst_file_path)

ftp.cwd("..")

ftp.quit()

def judge_file_dir(self,ftp,file_name,dst_file_path):

'''遞迴便利檔案

print("記錄成功",file_name)

else:

ftp.cwd(file_name)

for file_name in ftp.nlst(ftp.pwd()):

res = self.judge_file_dir(ftp,file_name,dst_file_path)

if not res:

continue

ftp.cwd("..")

def write_csv(self,ftp_file):

'''將self.csv的資料寫入data.csv檔案'''

global data_num

### 1萬條寫乙個csv

if len(self.csv)>10000:

data_num +=1

self.csv.clear()

self.csv = [["number", "folderbane", "barcode", "filename"]]

with open('download/data/data%s.csv'%data_num, 'w',encoding="utf-8", newline='')as csv_file:

# 獲取乙個csv物件進行內容寫入

writer = csv.writer(csv_file)

for row in self.csv:

# writerow 寫入一行資料

writer.writerow(row)

return true

if __name__ == "__main__":

host = "127.0.0.1"

username = "anonymous"

password = ""

port = 21

dst_file_path = os.getcwd()

ftp = ftp_op(host=host, username=username, password=password, port=port)

start_time = time.time()

print("記錄開始")

ftp.download_file(dst_file_path)

between_time = time.time()

print("記錄結束,用時%.2fs"%(between_time-start_time))

將本地的檔案上傳到sftp伺服器,由於paramiko,沒有提供一次行建立多層目錄的功能,所以採用了乙個笨辦法,把目錄按"/"切割成字串

在逐步拼接出目錄,使用 sftp.listdir(sftp_path) 方法,如果丟擲異常則目錄不存在是用 sftp.mkdir(sftp_path)建立出這一級目錄。

class sftp_op(object):

def __init__(self, host, username, password, port):

self.host = host

self.port = port

self.username = username

self.password = password

self.set= set()

def sftp_upload(self,local_list,remote):

sf = paramiko.transport((self.host,self.port))

sf.connect(username = self.username,password = self.password)

sftp = paramiko.sftpclient.from_transport(sf)

for local_url in local_list:

sftp_url = os.path.join(remote,local_url.split("download/")[-1])

sftp_path_list = sftp_url.split("/")[4:-1]

sftp_path = "/upload/pim/photobaseimages"

for path in sftp_path_list:

sftp_path = sftp_path + "/" +path

if sftp_path in self.set:

continue

else:

try:

sftp.listdir(sftp_path)

self.set.add(sftp_path)

except exception as e:

sftp.mkdir(sftp_path)

self.set.add(sftp_path)

print("local_url"+local_url)

print("sftp_url"+sftp_url)

sftp.put(local_url,sftp_url)#上傳檔案

print("上傳成功",sftp_url)

sf.close()

web伺服器和ftp伺服器

web伺服器又稱網路伺服器,http伺服器 伺服器的精髓就是你想在我這看到東西,裡面放一堆網頁,你向我傳送請求,我就找找找,把網頁給你。web伺服器使用的協議是http https 客戶機叫http客戶端 瀏覽器就叫http客戶端 8uftp就叫ftp客戶端 每天都獲取位址,電腦上有dhcp客戶端 ...

python實現FTP伺服器

使用python的pyftpdlib庫可以建立乙個簡單的ftp服務,首先需要安裝這個庫。安裝很簡單,開啟命令列用pip直接安裝就可以 pip install pyftpdlib 或者 python m pip install pyftpdlib ftp分為被動模式和主動模式,這裡不細說了,下面的例子...

python 搭建ftp伺服器

示例 coding utf 8 import osfrom pyftpdlib.authorizers import dummyauthorizer from pyftpdlib.handlers import ftphandler from pyftpdlib.servers import ftp...