免责声明:网站内容仅供个人学习记录,禁做商业用途,转载请注明出处。

版权所有 © 2017-2020 NEUSNCP个人学习笔记 辽ICP备17017855号-2

Python3实现 Linux 文件监控并上传到FTP

hxy    2018年5月4日 10:16:06

在开始之前需要搭建FTP服务器,以CentOS为例,参见上一篇博客:【Linux配置vsftp】http://www.neusncp.com/user/blog?id=66

在windows环境里,python3上传ftp应用中,中文路径会出现乱码问题,但是Python3的字符串没有直接的decode方法,因此在ftp客户端配置编码中使用GB18030编码,乱码问题解决。完整代码如下:

#-*- coding:utf-8 -*-

import os
from watchdog.observers import Observer
from watchdog.events import *
import time
import threading
import ftplib


def ftpconnect():
    #ftp服务器的IP
    ftp_server = 'neutcp.top'
    #ftp的用户名
    username = '你的账户'
    #用户的密码
    password = '你的密码'
    #创建一个ftp的实例
    ftp=ftplib.FTP(ftp_server)
    ftp.encoding = 'GB18030'
    #打开调试级别2,显示详细信息
    ftp.set_debuglevel(2)
    #连接ftp服务器,需要输入IP,端口,以及超时时间
    #连接的用户名、密码
    ftp.login(username,password)
    pwd_path = ftp.pwd()
    print("FTP当前路径:", pwd_path)
    return ftp


def upload_to_ftp(localpath, filename):
    try:
        ftp = ftpconnect()
        remotepath = "/%s"%filename
        print(ftp.getwelcome())
        bufsize = 1024
        with open(localpath,'rb') as fp:
            fp.seek(0)
            ftp.storbinary('STOR ' + remotepath, fp, bufsize)
            ftp.set_debuglevel(0)
            ftp.quit()
    except Exception as e:
        print(e)


class FileEventHandler(FileSystemEventHandler):
    def __init__(self):
        FileSystemEventHandler.__init__(self)

    def on_moved(self, event):
        if event.is_directory:
            print("directory moved from {0} to {1}".format(event.src_path,event.dest_path))
        else:
            print("file moved from {0} to {1}".format(event.src_path,event.dest_path))
            # upload_to_ftp(event.src_path, os.path.basename(event.src_path))

    def on_created(self, event):
        if event.is_directory:
            print("directory created:{0}".format(event.src_path))
        else:
            print("file created:{0}".format(event.src_path))
            upload_to_ftp(event.src_path, os.path.basename(event.src_path))

    def on_deleted(self, event):
        if event.is_directory:
            print("directory deleted:{0}".format(event.src_path))
        else:
            print("file deleted:{0}".format(event.src_path))

    def on_modified(self, event):
        if event.is_directory:
            print("directory modified:{0}".format(event.src_path))
        else:
            print("file modified:{0}".format(event.src_path))
            # upload_to_ftp(event.src_path, os.path.basename(event.src_path))


if __name__ == "__main__":
    observer = Observer()
    event_handler = FileEventHandler()
    observer.schedule(event_handler,"d:/",True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

运行代码可能会出现固定路径的错误,需要修改vsftpd.conf里面的配置:

chroot_list_enable=NO

 

浏览: 1.9K

[[total]] 条评论

添加评论
  1. [[item.time]]
    [[item.user.username]] [[item.floor]]楼
  2. 点击加载更多……
  3. 添加评论