玖叶教程网

前端编程开发入门

一篇文章让你快速学习Python编程自动化开发学习9-paramiko模块

第三方库的安装

下面要讲的paramiko是一个第三方库。这是第一次使用到第三方库,要使用第三方库需要先进行安装。不过现在安装过程比较简单,一条命令便可以完成库的下载和安装。下面就用paramiko模块举例安装的方法。

使用系统命令行安装

安装第三方库,建议直接用pip安装。Windows和Linux都适用

如何通过Pycharm远程开发Python django博客项目?

Python Paramiko模块的使用!(含实际案例)

前言:

Windows下有很多非常好的SSH客户端,比如Putty。在python的世界里,你可以使用原始套接字和一些加密函数创建自己的SSH客户端或服务端,但如果有现成的模块,为什么还要自己实现呢。使用Paramiko库中的PyCrypto能够让你轻松使用SSH2协议。

手把手教你将一个旧的大型项目迁移到 Python 3

一年半前,我们就决定使用 Python 3 了。我们已经讨论了很长时间,现在是时候使用了!现在这个过程已经结束了,我们已经把生产环境的最后部署都迁移到了 Python 3

  • 整个代码库大约有 240 k 行,不包括空行和注解。
  • 这是一个基于 Web 的批处理任务系统。并且只有一个生产,部署环境。

centos7中crontab定时执行python脚本不生效

问题: 最近在项目中遇到crontab中定时执行python脚本不生效,但是手动直接运行python脚本能够正常执行。

系统环境: centos7

python安装路径:/root/anaconda3/bin/python

手把手教你配置pycharm远程开发python项目教程,小白都能看懂

使用虚拟专用网络的Python Web抓取

爬虫程序在使用IPV4地址在网络中爬取数据时经常受到速度限制。使用IPv6地址有助于缓解这一问题,但并非所有网站都支持IPv6。使用多个IPv4地址分散连接有助于降低任何一个地址受到速率限制的风险。

除此之外,云主机的IPv4地址很容被识别,而且通常会被判定为机房IP,相比之下,住宅IPv4地址面临的审查较少。

SublimeText3中使用SFTP编辑远程服务器文件

Sublime Text 3 本身并不强大,但是它方便使用插件扩展功能,所以变得很强大。今天介绍一个很实用的插件 SFTP ,可以大大提高程序猿的工作效率。

  1. 首先安装sftp插件

用python快速实现一个FTP自动下载功能

该功能产生背景
由于客户经常需要从远程服务器上下载大量数据文件到本地解析分析,接到这个活后,刚开始用最原始的方法从服务器上拉了2天才把文件拉到本地,真是手拉到抽筋,眼睛盯着屏幕发肿,如是在网上看了点资料,用python完成一个FTP或SFTP自动下文件的功能

下面的代码实现了一个FTP和SFTP下载文件的脚本,主要功能是从指定的FTP或SFTP服务器下载符合条件的文件到本地目录。首先定义了一个抽象类AbstractFTPClient,其中包含了一些操作FTP的抽象方法,如切换目录cd、获取当前目录pwd、列出目录下的文件列表ls、下载文件get等等。这些方法需要在具体的子类中实现。然后有两个子类FTPClient和SFTPClient,分别基于ftputil和paramiko库实现了AbstractFTPClient中定义的方法。FTPClient和SFTPClient分别对应FTP和SFTP两种协议的文件传输客户端。接下来是一个MyFTP类,它根据传入的协议类型(默认为SFTP)选择相应的协议客户端,并封装了常用的操作方法,如列出最近更新的文件列表list_recent、下载文件get、递归上传文件夹put_r等。最后是一个main函数,读取一个接口配置文件interface_path(csv格式),并通过多进程池Pool并发下载文件。具体操作是先解析接口配置文件得到一组FTP服务器的信息,然后遍历每个FTP服务器,根据设定的条件筛选出符合要求的文件,将其下载到本地目录。整个脚本的逻辑是:根据接口配置文件的信息,连接到FTP服务器并获取文件列表,然后根据设定的时间条件筛选出需要下载的文件,最后将这些文件下载到本地目录中。
实现流程粗略讲解开始 -> 读取接口配置文件(interface_path) -> 获取FTP服务器信息(omc_info_list) -> 创建本地目录(local_dir) -> 创建多进程池(Pool) -> 遍历omc_info_list中的每个omc_info ->
    -> 创建FTP对象(ftp) -> 列出最近更新的文件列表(filelist) ->
    -> 遍历filelist中的每个文件(i) ->
        -> 提取文件名(filename)和文件修改时间(filetime) ->
        -> 判断文件修改时间是否符合设定条件 ->
            -> 如果符合条件 ->
                -> 打印"文件下载成功"信息 -> 构建本地文件路径(local_path) ->
                -> 下载文件到本地(local_path) ->
            -> 否则 ->
                -> 继续下一个文件的判断 ->
    -> 关闭FTP对象(ftp) -> 结束遍历omc_info_list ->
关闭多进程池(Pool) -> 结束
废话不多说直接上代码
from multiprocessing import Poolimport pandas as pd
import os
from datetime import datetime
import ftputil
import ftputil.session
from abc import ABCMeta, abstractmethod
import paramiko
from dateutil.parser import parse


class AbstractFTPClient(metaclass=ABCMeta):
    """
        ftp/sftp/... client(file transfer client) abstract class
        抽象方法需要全部实现,其它方法,子类自行扩展。
    """
    @abstractmethod
    def cd(self, path) -> None:
        pass

    @abstractmethod
    def pwd(self) -> str:
        pass

    @abstractmethod
    def ls(self, path='.') -> list:
        pass

    @abstractmethod
    def get(self, remote, local) -> None:
        pass

    @abstractmethod
    def put(self, local, remote) -> None:
        pass

    @abstractmethod
    def put_r(self, local, remote) -> None:
        """
        recursive put, mkdir if directory does not exist
        :param local: local path
        :param remote: remote path
        :return:
        """
        pass

    @abstractmethod
    def getsize(self, path) -> int:
        """
        get file size
        :param path: remote file path
        :return: file size
        """
        pass

    @abstractmethod
    def getmtime(self, path) -> datetime:
        """
        get file recently modify time
        :param path: remote file path
        :return: datetime.datetime
        """
        pass

    @abstractmethod
    def close(self) -> None:
        pass


class FTPClient(AbstractFTPClient):
    """ base on ftputil """
    def __init__(self, ip, user, password, port=xx, mode='passive'):
        my_session_factory = ftputil.session.session_factory(port=port, use_passive_mode=None)
        self._ftp = ftputil.FTPHost(ip, user, password, session_factory=my_session_factory)

    def cd(self, path):
        self._ftp.chdir(path)

    def pwd(self):
        return self._ftp.getcwd()

    def ls(self, path='.'):
        return self._ftp.listdir(path)

    def get(self, remote, local):
        self._ftp.download(remote, local)

    def put(self, local, remote):
        self._ftp.upload(self, local, remote)

    def put_r(self, local, remote):
        try:
            self.put(local, remote)
            print("put: {}".format(local))
        except:
            parent = local
            dirs = []
            while parent != '/':
                parent = os.path.dirname(parent)
                dirs.append(parent)
            for d in reversed(dirs):
                try:
                    self._ftp.mkdir(d)
                    print("mkdir: {}".format(d))
                except:
                    pass
            self.put(local, remote)
            print("put after mkdir: {}".format(local))

    def getsize(self, path):
        return self._ftp.path.getsize(path)

    def getmtime(self, path):
        return datetime.fromtimestamp(self._ftp.path.getmtime(path))

    def close(self):
        self._ftp.close()


class SFTPClient(AbstractFTPClient):
    """ base on paramiko """
    def __init__(self, ip, user, password, port=xx, mode='passive'):
        t = paramiko.Transport(sock=(ip, port))
        t.connect(username=user, password=password)
        self._ftp = paramiko.SFTPClient.from_transport(t)

    def cd(self, path):
        self._ftp.chdir(path)

    def pwd(self):
        return self._ftp.getcwd()

    def ls(self, path='.'):
        return self._ftp.listdir(path)

    def get(self, remote, local):
        self._ftp.get(remote, local)

    def getfo(self, remote, fo):
        """
        :param fo: file-like obj
        """
        self._ftp.getfo(remote, fo)

    def put(self, local, remote):
        self._ftp.put(local, remote)

    def put_r(self, local, remote):
        try:
            self.put(local, remote)
            print("put: {}".format(local))
        except:
            parent = local
            dirs = []
            while parent != '/':
                parent = os.path.dirname(parent)
                dirs.append(parent)
            for d in reversed(dirs):
                try:
                    self._ftp.mkdir(d)
                    print("mkdir: {}".format(d))
                except:
                    pass
            self.put(local, remote)
            print("put after mkdir: {}".format(local))

    def getsize(self, path):
        return self._ftp.stat(path).st_size

    def getmtime(self, path):
        return datetime.fromtimestamp(self._ftp.stat(path).st_mtime)

    def close(self):
        self._ftp.close()


class MyFTP():
    def __init__(self, ip, user, password, protocol='sftp'):
        # 部分ftp服务器需要用不同的ftp模型类
        on_off = 0
        if on_off == 0:
            print('FTP')
            self.ftp = FTPClient(ip, user, password, port=21)
        else:
            print('SFTP')
            self.ftp = SFTPClient(ip, user, password, port=22)


    def list_recent(self, path):
        filelist = []
        dirlist = [path]
        while dirlist != []:
            absdir = dirlist.pop(0)
            try:
                names = self.ftp.ls(absdir)
            except:
                names = []
            for name in names:
                fullname = absdir + '/' + name
                if os.path.splitext(name)[1] == '':
                    dirlist.append(fullname)
                else:
                    filelist.append(fullname)
        return filelist

    def get(self, remote, local):
        self.ftp.get(remote, local)

    def put_r(self, local, remote):
        self.ftp.put_r(local, remote)

    def close(self):
        self.ftp.close()


def get_interface(interface_path):
    df = pd.read_csv(interface_path,encoding='gbk')
    omc_info_lists = df.to_dict(orient='records')
    # print(omc_info_lists)
    return omc_info_lists


def download(omc_info, local_dir):
    try:
        ftp = MyFTP(omc_info['ip'], omc_info['ftpuser'], str(omc_info['ftppassword']))
        ip_dir = os.path.join(local_dir, omc_info['ip'])
        if not os.path.exists(ip_dir):
            os.mkdir(ip_dir)
    except Exception as e:
        print(e)
        print('{} connection fail '.format(omc_info['ip']))
        print(omc_info['ip'], omc_info['ftpuser'], str(omc_info['ftppassword']))
    else:
        filelist = ftp.list_recent(omc_info['ftppath'])
        # print(filelist[0])
        if filelist:
          )
            for i in filelist:
                filename = i.split("/")[-1]
                print(filename)
               
                filetime = parse(filename.split('_')[-3])
              
                if filetime >= datetime.strptime('2022-12-27 00:00:00','%Y-%m-%d %H:%M:%S') and filetime < datetime.strptime('2022-12-30 00:00:00','%Y-%m-%d %H:%M:%S'):
                    print("{} is downloaded :{}".format(omc_info['ip'], filename))
                    local_path = os.path.join(ip_dir, filename)
                    try:
                        ftp.get(i, local_path)
                    except Exception as e:
                        print('{} download fail '.format(filename))
                else:
                    continue
        else:
            print('IP{} directory or path is not exists!'.format(omc_info['ip']))
        ftp.close()


def main(interface_path):
    # 结果路径
    local_dir = './house-8.24-8.27'
    #local_dir = './house_0429'

Python3.6离线安装,离线安装第三方模块

一、Python3.6离线安装

1、安装依赖包

yum -y install zlib-devel openssl openssl-devel
<< < 1 2 3 4 5 6 > >>
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言