最近接到乙個任務,需要寫乙個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...