使用ftplib模块,实现列出ftp上指定目录下的所有文件,包含子目录

# coding: utf-8
# for python35+

import os
import ftplib

class FtpTools(object):
    def __init__(self, host, username, password):
        self.dir_sum = 0
        self.res_sum = 0
        self.size_sum = 0
        self.host = host
        self.username = username
        self.password = password
        self.ftp = ftplib.FTP(self.host)
        self.ftp.login(self.username, self.password)
        self.ftp.encoding='utf-8'

    def filelist(self, ftp_dir):
        self.ftp.cwd(ftp_dir)
        for name, facts in self.ftp.mlsd(".",["type", "size"]):
            if facts["type"] == "dir":
                if self.ftp.pwd().endswith('/'):
                    dir_cwd = self.ftp.pwd() + name
                else:
                    dir_cwd = self.ftp.pwd() + os.sep + name
                try:
                    self.dir_sum += 1
                    self.filelist(dir_cwd)
                    self.ftp.cwd('..')
                except:
                    pass
            else:
                self.res_sum += 1
                self.size_sum += int(facts["size"])
                if self.ftp.pwd().endswith('/'):
                    res_path = self.ftp.pwd() + name
                else:
                    res_path = self.ftp.pwd() + os.sep + name
                print (res_path)
        
    def count(self):
        count_msg = f"文件夹: {self.dir_sum}, 文件数: {self.res_sum}, 总大小: {self.size_sum/1024/1024}/MB"
        print (count_msg)

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


if __name__ == "__main__":
    host = "192.168.1.111"
    username = "test"
    password = "test.com"

    ftptools = FtpTools(host, username, password)
    ftptools.filelist('/')
    ftptools.count()

结果

(py3) [root@mongodb ftptools]# python ftptools.py 
/bitnami-redmine-4.0.2-0-linux-x64-installer.run
/mysite-master/blogApp/admin.py
/mysite-master/blogApp/apps.py
/mysite-master/blogApp/models.py
/mysite-master/blogApp/serializers.py
/mysite-master/blogApp/tests.py
/mysite-master/blogApp/urls.py
/mysite-master/blogApp/views.py
/mysite-master/manage.py
/mysite-master/mysite/settings.py
/mysite-master/mysite/urls.py
/mysite-master/mysite/wsgi.py
/mysite-master/README.md
/mysite-master/requirments.txt
/mysite-master/同步.bat
/mysite-master/启动.bat
...
/procexp64.exe
/TeamViewer_Setup.exe
文件夹: 10, 文件数: 56, 总大小: 240.06631660461426/MB

利用ForgeryPy生成虚拟数据

在程序研发过程中,我们往往需要大量的虚拟实验数据。Python中有多个包可以用于生成虚拟数据,其中功能较为完善的是ForgeryPy。


0x01 安装

采用pip进行安装:

pip install ForgeryPy


0x02 模块

打开源码:

# -*- coding: utf-8 -*-
# Copyright (C) 2012 by Tomasz Wójcik <labs@tomekwojcik.pl>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

"""Easy to use generator of various forged data."""

from .forgery import address
from .forgery import basic
from .forgery import currency
from .forgery import date
from .forgery import internet
from .forgery import lorem_ipsum
from .forgery import name
from .forgery import personal

ForgeryPy包括了地理位置、日期、网络、名称等大量虚拟生成算法,非常方便我们用来生成虚拟数据。

0x03 例子

#coding:utf-8

import forgery_py

#地理信息(城市)
city=forgery_py.address.city()
#随机颜色
color=forgery_py.basic.hex_color()
#时间
data=forgery_py.date.date(True)
#电子邮箱
email=forgery_py.internet.email_address()
#姓名
name=forgery_py.name.full_name()
#公司
company=forgery_py.name.company_name()
#简介
about=forgery_py.lorem_ipsum.sentence()

print(city)
print(color)
print(data)
print(email)
print(name)
print(company)
print(about)

# 结果
Daly City
19648C
2019-03-08
sean@twimm.info
David Brown
Zoombeat
Nunc purus.

更多好玩的去看源码

python itertools模块实现排列组合

一、笛卡尔积:itertools.product(*iterables[, repeat])

直接对自身进行笛卡尔积:

import itertools
for i in itertools.product('ABCD', repeat=2):
    print (''.join(i),end=' ')

输出结果: 
AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD 
print (”.join(i))这个语句可以让结果直接排列到一起 
end=”可以让默认的输出后换行变为一个空格

两个元组进行笛卡尔积:

import itertools
a = (1, 2, 3)
b = ('A', 'B', 'C')
c = itertools.product(a,b)
for i in c:
    print(i,end=' ')

输出结果: 
(1, ‘A’) (1, ‘B’) (1, ‘C’) (2, ‘A’) (2, ‘B’) (2, ‘C’) (3, ‘A’) (3, ‘B’) (3, ‘C’)

二、排列:itertools.permutations(iterable[, r])

import itertools
for i in itertools.permutations('ABCD', 2):
    print (''.join(i),end=' ')

输出结果: 
AB AC AD BA BC BD CA CB CD DA DB DC

三、组合:itertools.combinations(iterable, r)

import itertools
for i in itertools.combinations('ABCD', 3):
    print (''.join(i))

输出结果: 
ABC 
ABD 
ACD 
BCD

四、组合(包含自身重复):itertools.combinations_with_replacement(iterable, r)

import itertools
for i in itertools.combinations_with_replacement('ABCD', 3):
    print (''.join(i),end=' ')

输出结果: 
AAA AAB AAC AAD ABB ABC ABD ACC ACD ADD BBB BBC BBD BCC BCD BDD CCC CCD CDD DDD

python之IP地址或IP段处理模块-ipaddr

IPy基本处理8位、16位、24位掩码的网段,其他的网段处理起来就会出现问题。

ipaddr是google出的一个模块,很好的可以处理模块IPy不能解决这个问题,所以建议使用模块ipaddr 

IPy模块地址:https://pypi.python.org/pypi/IPy/
ipaddr模块地址:https://pypi.python.org/pypi/ipaddr

使用介绍:

Class总共分为:BaseIP、IPv4、IPv6

ipaddr.IPv4Network()    ipv4网段对象建立

ipaddr.IPv6Network()    ipv6网段对象建立

ipaddr.IPAddress(address, version)    单个ipv4地址对象建立


部分对象方法描述:

Contains()     网段中是否包含某个IP
is_private     是否是私网地址
is_multicast   是否是广播地址
is_loopback    是否是loop地址
IsLoopback     是否是回环地址
IsMulticast    是否是多播地址
broadcast      查看广播地址
hostmask       查看子网掩码
iterhost       创建一个网段中一个IP地址列表的迭代器对象
is_reserved    是否是保留地址


实例讲解:

#!/usr/bin/python
# coding: utf-8

import ipaddr

MIP = "192.168.1.0/29"

### 创建一个网段的对象,ipv4的网段地址
ips = ipaddr.IPNetwork(MIP)

### 查看对象ips的类型
print type(ips)

### 查看网段的广播地址
print ipaddr.IPv4Network(MIP).broadcast

### 查看网段地址的掩码
print ipaddr.IPv4Network(MIP).hostmask

### 创建一个网段中一个IP地址列表的迭代器对象
hosts = ipaddr.IPv4Network(MIP).iterhosts()

### 使用循环读取对象中的每个IP
print type(hosts)
for IP in hosts:
    print IP

Python 异常 Exception

常见异常:

Exception                        所有异常的基类
AttributeError                 特性应用或赋值失败时引发
IOError                             试图打开不存在的文件时引发
IndexError                       在使用序列中不存在的索引时引发
KeyError                          在使用映射不存在的键时引发
NameError                       在找不到名字(变量)时引发
SyntaxError                     在代码为错误形式时引发
TypeError                         在内建操作或者函数应用于错误类型的对象是引发
ValueError                       在内建操作或者函数应用于正确类型的对象,但是该对象使用不合适的值时引发
ZeroDivisionError          在除法或者摸除操作的第二个参数为0时引发

实例参考

try:  
    x = int(input('input x:'))  
    y = int(input('input y:'))  
    print('x/y = ',x/y)  
except ZeroDivisionError: #捕捉除0异常  
    print("ZeroDivision")  
except (TypeError,ValueError) as e: #捕捉多个异常  
    print(e)  
except: #捕捉其余类型异常  
    print("it's still wrong")  
else:  #没有异常时执行  
    print('it work well')  
finally: #不管是否有异常都会执行  
    print("Cleaning up")  
  
结果:
input x:12  
input y:3  
x/y =  4.0  
it work well  
Cleaning up  

Python模块学习37 — tarfile

The tarfile module makes it possible to read and write tar archives, including those using gzip, bz2 and lzma compression. Use the zipfile module to read or write .zip files, or the higher-level functions in shutil.

官方文档:https://docs.python.org/2.7/library/tarfile.html

  • 打包及重命名文件
>>> import tarfile
# 以w模式创建文件
>>> tar = tarfile.open('tar_file.tar','w')
# 添加一个文件,arcname可以重命名文件
>>> tar.add('/tmp/folder/file.txt', arcname='file.log')
# 添加一个目录
>>> tar.add('/tmp/folder/tmp')                         
# 关闭
>>> tar.close()
  • 查看文件列表
>>> tar = tarfile.open('tar_file.tar','r')             
# 获取包内的所有文件列表
>>> tar.getmembers()
[<TarInfo 'file.log' at 0x7f737af2da70>, <TarInfo 'tmp/folder/tmp' at 0x7f737af2dd90>]
  • 追加
# 以w模式创建文件
>>> tar = tarfile.open('tar_file.tar','a')
>>> tar.add('/tmp/folder/sc.pyc')
>>> tar.close()
>>> tar = tarfile.open('tar_file.tar','r')
>>> tar.getmembers()
[<TarInfo 'file.log' at 0x7ff8d4fa1110>, <TarInfo 'tmp/folder/tmp' at 0x7ff8d4fa11d8>, <TarInfo 'tmp/folder/sc.pyc' at 0x7ff8d4fa12a0>]
  • 解压全部文件
>>> import os
>>> import tarfile
>>> os.system("ls -l")
总用量 12
-rw-rw-r-- 1 ansheng ansheng 10240 5月  26 17:40 tar_file.tar
0
>>> tar = tarfile.open('tar_file.tar','r')
>>> tar.extractall()
>>> tar.close()
>>> os.system("ls -l")
总用量 16
-rw-rw-r-- 1 ansheng ansheng     0 5月  26 16:05 file.log
-rw-rw-r-- 1 ansheng ansheng 10240 5月  26 17:40 tar_file.tar
drwxrwxr-x 3 ansheng ansheng  4096 5月  26 17:48 tmp
0

  • 解压单个文件

如果我们的压缩包很大的情况下,就不能够一次性解压了,那样太耗内存了,可以通过下面的方式进行解压,其原理就是一个文件一个文件的解压。

import tarfile
tar = tarfile.open('tar_file.tar','r')
for n in tar.getmembers():
    tar.extract(n,"/tmp")
tar.close()

Python模块学习36 — Queue

import Queue
myqueue = Queue.Queue(maxsize = 10)

Queue.Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。

将一个值放入队列中

myqueue.put(10)

调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。

将一个值从队列中取出

myqueue.get()

调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。 继续阅读 > >

Python模块学习35 — Argparse

官方文档:https://docs.python.org/2/howto/argparse.html

Python模块学习34 — smtplib

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
Python创建 SMTP 对象语法如下:

import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

参数说明:
    host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如:smtp.exmail.qq.com,这个是可选参数。
    port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下SMTP端口号为25。
    local_hostname: 如果SMTP在你的本机上,你只需要指定服务器地址为 localhost 即可。 

Python SMTP对象使用sendmail方法发送邮件,语法如下:
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]

参数说明:
    from_addr: 邮件发送者地址。
    to_addrs: 字符串列表,邮件发送地址。
    msg: 发送消息 
继续阅读 > >

Python模块学习33 — poplib

POP(The Post Office Protocol),是一个简单的协议。它可以用来从邮件服务器上下载邮件。
POP最常用的版本是3,通常被称为POP3。因为版本3用的实在是太广泛了。因此POP和POP3经常可以互换使用。
Python提供一个模块称为poplib,它提供一个使用POP的便利接口。

使用poplib来连接服务器,取得邮箱信息,下载邮件并在服务器上删除邮件。这就是POP所有标准的特性。

—————————-
USER user username 认可 用户名,此命令与下面的pass命令若成功,将导致状态转换
PASS pass_ password 认可 用户密码
APOP apop Name,Digest 认可 Digest是MD5消息摘要
—————————-
STAT stat None 处理 请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数
UIDL uidl [Msg#] 处理 返回邮件的唯一标识符,POP3会话的每个标识符都将是唯一的
LIST list [Msg#] 处理 返回邮件数量和每个邮件的大小
RETR retr [Msg#]    处理 返回由参数标识的邮件的全部文本
DELE dele [Msg#]    处理 服务器将由参数标识的邮件标记为删除,由quit命令执行
RSET rset None    处理 服务器将重置所有标记为删除的邮件,用于撤消DELE命令
TOP top [Msg#] 处理 服务器将返回由参数标识的邮件前n行内容,n必须是正整数
NOOP noop None 处理 服务器返回一个肯定的响应
—————————- 继续阅读 > >