91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Python中使用FtpLib模塊

發布時間:2021-03-18 16:23:01 來源:億速云 閱讀:164 作者:Leah 欄目:開發技術

如何在Python中使用FtpLib模塊?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

Python之FtpLib模塊應用

工廠中有這樣的應用場景: 需要不間斷地把設備電腦生成的數據文件上傳到遠程文件存儲服務器NAS中。

在python自帶的標準庫中找到ftplib模塊,可以幫助實現文件的上傳。

場景功能的實現需要做到以下幾點:

  • 給定本地路徑,上傳范圍是否包含子文件夾及其文件

  • 限定或不限定 哪些文件類型的文件,文件名包含哪些字符串的文件

  • 文件上傳后,本地是否要保留

  • 掃完一次本地路徑,進行下次循環的間隔周期

  • 生成log日志方便查看報錯與已上傳的文件,日志文件保留多久之后要刪除

思路是這樣子,以上內容設計成一個config 文件進行管控。

1.config.xml文件設置

<?xml version="1.0"?>
<Config>
 <ServerIP>10.16.xx.xx</ServerIP>
 <UserID>cc</UserID>
 <Passwd>xxx</Passwd>
 <LogBackupDay>10</LogBackupDay>
 <UploadCheck>TRUE</UploadCheck>
 <Loop_Sec>30</Loop_Sec>
 <LocalDirectory>C:\Users\Administrator\Desktop\TEST\</LocalDirectory>
 <RemoteDirectory>/DATA/AOI/T1TEST200/</RemoteDirectory>
 <FileExtension>csv</FileExtension>
 <FileNameContain>*</FileNameContain>
 <SubDirectoryCheck>TRUE</SubDirectoryCheck>
 <SubDirectoryCreateCheck>FALSE</SubDirectoryCreateCheck>
 <LocalFileBackupCheck>TRUE</LocalFileBackupCheck>
 <FileCreateTime>80</FileCreateTime>
</Config>
  • LogBackupDay 日志保留天數

  • UploadCheck 是否開啟上傳

  • Loop_Sec 掃描循環周期

  • LocalDirectory 本地路徑,結尾必須有路徑分隔符

  • RemoteDirectory 遠程路徑,結尾必須有路徑分隔符

  • FileExtension 文件類型,jpg,txt,py,log等等,為*時不限制文件類型

  • FileNameContain 文件名字符串 , 文件名包含哪些字符串的文件,為*時不限制文件名

  • SubDirectoryCheck 子文件夾的文件是否上傳

  • SubDirectoryCreateCheck 遠程路徑是否創建和本地路徑一樣的文件夾

  • LocalFileBackupCheck 本地文件是否保留

  • FIleCreateTime 掃描本地路徑中創建時間為多少個小時內的文件或文件夾

以下是讀取config.xml的代碼

from xml.dom.minidom import parse
def readConfig():
  '''讀取上傳配置'''
  conf=parse(os.getcwd()+os.sep+'config.xml');#config文件與程序放在同一目錄
  host=conf.getElementsByTagName("ServerIP")[0].firstChild.data
  username =conf.getElementsByTagName("UserID")[0].firstChild.data
  passwd=conf.getElementsByTagName("Passwd")[0].firstChild.data
  logBackupDay=int(conf.getElementsByTagName("LogBackupDay")[0].firstChild.data)
  uploadCheck=conf.getElementsByTagName("UploadCheck")[0].firstChild.data
  uploadLoopTime=int(conf.getElementsByTagName("Loop_Sec")[0].firstChild.data)
  localDir=conf.getElementsByTagName("LocalDirectory")[0].firstChild.data
  remoteDir=conf.getElementsByTagName("RemoteDirectory")[0].firstChild.data
  fileExtension=conf.getElementsByTagName("FileExtension")[0].firstChild.data
  fileNameContain=conf.getElementsByTagName("TxtFileNameContain")[0].firstChild.data
  subDirCheck=conf.getElementsByTagName("SubDirectoryCheck")[0].firstChild.data
  subDirCreateCheck=conf.getElementsByTagName("SubDirectoryCreateCheck")[0].firstChild.data
  backupCheck=conf.getElementsByTagName("LocalFileBackupCheck")[0].firstChild.data
  fileCreateTime=int(conf.getElementsByTagName("FileCreateTime")[0].firstChild.data)
  conflist=[host,username,passwd,logBackupDay,uploadCheck,uploadLoopTime,
       localDir,remoteDir,fileExtension,fileNameContain,
       subDirCheck,subDirCreateCheck,backupCheck,fileCreateTime]
  return conflist

2.相關邏輯實現

文件類型及文件名檢驗

def checkFileExtension(localfile,extension):
  '''
  檢查文件名是否符合需要上傳的文件類型
  extension為*時,無文件類型限制上傳
  '''
  if extension=="*":
    return True
  elif localfile.endswith(extension):
    return True
  else:
    return False
def checkFileNameContains(localfile,filecontain):
  '''
  檢查特定文件名的文件
  filecontain 為 * 時,不限制上傳文件名
  '''
  if filecontain=="*":
    return True
  elif filecontain in localfile:
    return True
  else:
    return False

文件上傳之后,本地是否保留

def deleteLocalFile(deleteCheck,localfile):
  if not deleteCheck:
    os.remove(localfile)
    logger.info("Remove local file:{}".format(localfile))

只上傳創建時間為N個小時內的文件或文件夾

def checkFileModifiedTime(localfile,hour):
  '''只上傳創建時間為hour小時內的文件'''
  if os.stat(localfile).st_ctime<time.time()-hour*3600:
    return False
  else:
    return True

生成日志,日志文件保留多久

#創建logger日志
logger = logging.getLogger()
logger.setLevel(logging.INFO)
#filehandler
rq = time.strftime('%Y%m%d', time.localtime(time.time()))
log_path = os.getcwd()+os.sep + 'Logs'+os.sep
if not os.path.exists(log_path):
  os.mkdir(log_path)
log_name = log_path + rq + '.log'
logfile = log_name
fh = logging.FileHandler(logfile, mode='w')
fh.setLevel(logging.DEBUG)
#filehandler輸出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
logger.addHandler(fh)
def deleteLog(days):
  '''刪除多少天之前的日志文件'''
  for file2 in os.listdir(log_path):
    logfile=os.path.join(log_path,file2)
    if os.stat(logfile).st_ctime<time.time()-days*24*3600:
      os.remove(logfile)

展開子文件夾及相關判斷邏輯

def listFile(ftp,local,remote,subdircreatecheck,extension,filenamecontains,filecreatetime,
localBackupCheck):
  '''遞歸調用出子文件或子文件夾 
  ftp FTP實例
  local 本地文件[夾]
  remote 遠程文件[夾]
  subdircreatecheck 遠程是否創建對應的子文件夾
  extension 文件類型
  filecontains 文件名必須包含
  filecreatetime 文件修改時間在多少小時內的
  localBackupCheck 本地文件是否保留
  '''
  for file in os.listdir(local):
    local2=os.path.join(local,file) #路徑+文件名為 完整路徑
    remote2=remote+'/'+file
    try:
      if not checkFileModifiedTime(local2,filecreatetime):
        continue
      if not subdircreatecheck:
        remote2=remote
      if os.path.isdir(local2):
        try:             #驗證ftp遠程是否已有目錄  
          ftp.cwd(remote2)     #打開遠程目錄,無法打開則報異常,在異常處理里面創建遠程目錄
        except Exception as e:
          logger.error("Fail to open directory.")
          logger.info("Open directory: {} fail,so create dir.".format(remote2))
          ftp.mkd(remote2)
          logger.info("ItslocalDir:{}".format(local2))
        listFile(ftp,local2,remote2,subdircreatecheck,extension,filenamecontains,
             filecreatetime,localBackupCheck)
      else:
        if checkFileExtension(local2,extension):
          if checkFileNameContains(local2,filenamecontains):
            remote2=remote+'/'+file
            upload(ftp,local2,remote2)
            deleteLocalFile(local2,localBackupCheck)
    except Exception as e:
      logger.error(e.args[0])

上傳及異常檢驗

遠程文件已存在并且大小與本地一致時無需上傳,使用ftp.size()對比遠程文件與本地文件大小即可,出現異常表明遠程文件不存在。

def upload(ftp,localFile,remoteFile):
  '''以二進制形式上傳文件
  ftp.size()驗證遠程文件是否存在并且判斷文件大小
  '''
  try:
    if ftp.size(remoteFile)==os.path.getsize(localFile):
      return
  except ftplib.error_perm as err:
    logger.warning("{0}.When upload file:{1}".format(err.args[0],remoteFile))
  except Exception as e:
    logger.warning("other error!")
  uf = open(localFile, 'rb')
  bufsize = 1024 # 設置緩沖器大小
  try:
    ftp.storbinary('STOR ' + remoteFile, uf, bufsize)
    logger.info("File has upload success:{}".format(remoteFile))
  except:
    logger.error("File Upload Fail!:{}".format(remoteFile))
  finally:
    uf.close()

周期循環

logger.info("File Send Program Start!")
while uploadCheck:
  logger.info("File Send Program LoopStart!")
  deleteLog(logBackupDay)
  f=ftplib.FTP(host)
  try:
    ###
  except:
    ###
  finally:
    f.quit()
  logger.info("Loop end,wait for next loop!")
  time.sleep(loopTime)

3.打包exe文件

pyinstaller庫打包

值的注意的是,64位python環境下打包的exe不能在32位的Win7、xp運行。最后使用32位的python環境進行打包。

pyinstaller -i jftp.ico -F Jftp.py -w

看完上述內容,你們掌握如何在Python中使用FtpLib模塊的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阜新| 化隆| 屯昌县| 普定县| 安龙县| 体育| 朝阳县| 龙门县| 济南市| 高尔夫| 凤翔县| 乐清市| 绥中县| 南川市| 吉林市| 青龙| 平潭县| 瓮安县| 塘沽区| 通许县| 鄂温| 河北省| 满城县| 汉寿县| 新竹县| 盱眙县| 栖霞市| 中牟县| 新干县| 卢氏县| 连云港市| 隆德县| 永德县| 错那县| 绵阳市| 乌鲁木齐县| 施秉县| 全椒县| 若羌县| 柳州市| 和平区|