Fork me on GitHub

python基础---->常用模块

一、前言:

模块:用一部分代码实现了某个功能的代码集合,类似于函数式编程,定义一个函数完成某个功能呢,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成;

模块分为三种:自定义模块、第三方模块、内置模块

二、sys模块

用于提供对Python解释器相关的操作:

1 sys.argv           命令行参数List,第一个元素是程序本身路径
2 sys.exit(n)        退出程序,正常退出时exit(0)
3 sys.version        获取Python解释程序的版本信息
4 sys.maxint         最大的Int值
5 sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
6 sys.platform       返回操作系统平台名称
7 sys.stdin          输入相关
8 sys.stdout         输出相关
9 sys.stderror       错误相关

三、os模块

用于提供系统级别的操作:

 1 os.getcwd()                 获取当前工作目录,即当前python脚本工作的目录路径
 2 os.chdir("dirname")         改变当前脚本工作目录;相当于shell下cd
 3 os.curdir                   返回当前目录: ('.')
 4 os.pardir                   获取当前目录的父目录字符串名:('..')
 5 os.makedirs('dir1/dir2')    可生成多层递归目录
 6 os.removedirs('dirname1')   若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
 7 os.mkdir('dirname')         生成单级目录;相当于shell中mkdir dirname
 8 os.rmdir('dirname')         删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
 9 os.listdir('dirname')       列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
10 os.remove()                 删除一个文件
11 os.rename("oldname","new")  重命名文件/目录
12 os.stat('path/filename')    获取文件/目录信息
13 os.sep                      操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
14 os.linesep                  当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
15 os.pathsep                  用于分割文件路径的字符串
16 os.name                     字符串指示当前使用平台。win->'nt'; Linux->'posix'
17 os.system("bash command")   运行shell命令,直接显示
18 os.environ                  获取系统环境变量
19 os.path.abspath(path)       返回path规范化的绝对路径
20 os.path.split(path)         将path分割成目录和文件名二元组返回
21 os.path.dirname(path)       返回path的目录。其实就是os.path.split(path)的第一个元素
22 os.path.basename(path)      返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
23 os.path.exists(path)        如果path存在,返回True;如果path不存在,返回False
24 os.path.isabs(path)         如果path是绝对路径,返回True
25 os.path.isfile(path)        如果path是一个存在的文件,返回True。否则返回False
26 os.path.isdir(path)         如果path是一个存在的目录,则返回True。否则返回False
27 os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
28 os.path.getatime(path)      返回path所指向的文件或者目录的最后存取时间
29 os.path.getmtime(path)      返回path所指向的文件或者目录的最后修改时间

四、time模块

常用表示时间方式: 时间戳,格式化的时间字符串,元组(struct_time)

# struct_time转换成format_time

%a    本地(locale)简化星期名称
%A    本地完整星期名称
%b    本地简化月份名称
%B    本地完整月份名称
%c    本地相应的日期和时间表示
%d    一个月中的第几天(01 - 31%H    一天中的第几个小时(24小时制,00 - 23%I    第几个小时(12小时制,01 - 12%j    一年中的第几天(001 - 366%m    月份(01 - 12%M    分钟数(00 - 59%p    本地am或者pm的相应符    一
%S    秒(01 - 61)    二
%U    一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。
%w    一个星期中的第几天(0 - 6,0是星期天)    三
%W    和%U基本相同,不同的是%W以星期一为一个星期的开始。
%x    本地相应日期
%X    本地相应时间
%y    去掉世纪的年份(00 - 99%Y    完整的年份
%Z    时区的名字(如果不存在为空字符)
%%    ‘%’字符

实例:结合sys,time模块实现进度条

进度百分比
import sys
import time


def view_bar(num, total):
    rate = float(num) / float(total)
    rate_num = int(rate * 100)
    r = '\r%d%%' % (rate_num, )
    sys.stdout.write(r)
    sys.stdout.flush()


if __name__ == '__main__':
    for i in range(0, 100):
        time.sleep(0.1)
        view_bar(i, 100)

五、random模块

random.random()    # 0~1 随机浮点数
random.randint(1,100)   #随机整数1~100
random.randrange(1,7)   #随机整数,不包括7
random.choice('hello world')   #随机获取一个字符
random.choice(['1','2','3',])    #随机获取一个元素
random.sample([1,2,3,4,5],3) #random.sample的函数原型为:random.sample(sequence, k)从指定序列中随机获取指定长度的片

实例:生成随机验证码

版本一:

import random
def check_code():
    check_code = ""
    for i in range(4):
        num = random.randint(0,9)             #随机选择0~9
        A1Z1 = chr(random.randint(65,90))     #随机选择A~Z
        a1z1 = chr(random.randint(97,122))    #随机选择a~z
        add = random.choice([num,A1Z1,a1z1])  #随机选择其中一个
        check_code = "".join([code,str(add)])       #拼接一次选到的元素
    return check_code                               #返回验证码#
print(check_code())

版本二:

import random
checkcode = ''
for i in range(4):
    current = random.randrange(0,4)
    if current != i:
        temp = chr(random.randint(65,90))
    else:
        temp = random.randint(0,9)
    checkcode += str(temp)
print checkcode

五、re模块

 python中re模块提供了正则表达式相关操作

1     次数:
2     *     重复零次或更多次
3     +     重复一次或更多次
4    ?        重复零次或一次
5     {n}    重复n次
6    {n,}    重复n次或更多次
7    {n,m}    重复n到m次

其中提供的方法有:

match、search、findall、sub、split

import re
#1
print(re.findall('e','clint love you') )   #['e', 'e'],返回所有满足匹配条件的结果,放在列表里
#2
print(re.search('e','clint love you').group()) #e,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。

#3
print(re.match('e','clint love you'))    #None,同search,不过在字符串开始处进行匹配,完全可以用search+^代替match

#4
print(re.split('[ab]','abcd'))     #['', '', 'cd'],先按'a'分割得到''和'bcd',再对''和'bcd'分别按'b'分割

#5
print('===>',re.sub('c','C','clint love you')) #===> Clint love you,不指定n,默认替换所有
print('===>',re.sub('l','L','clint love you',1)) #===> cLint love you
print('===>',re.subn('c','C','clint love you')) #===> ('Alex mAke love', 2),结果带有总共替换的个数

#6
obj=re.compile('\d{2}')

print(obj.search('abc123eeee').group()) #12
print(obj.findall('abc123eeee')) #['12'],重用了obj

 几个匹配的实用例子:

# 邮箱表达式
email = r'^[a-aA-Z0-9_-]+@[a-aA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$'
# 例如:
# clint1801@163.com
# 472400995@qq.com
# s180231943@stu.cqupt.edu.cn   企业邮箱
'''
你会发现 后面 \. 这是什么意思?
 因为  . 表示匹配任意除换行符"\n"外的字符,而我们要匹配邮箱中的 .  
 所以 需要用到 \   \ 表示转义字符
 注:

    小括号():匹配小括号内的字符串
    中括号[]:匹配字符组内的字符
    大括号{}:匹配的次数
'''
邮箱 表达式
# 手机号表达式
phone = r'^1[3578]\d{9}$'
手机号 表达式

IP的正则表达式:

这里讲的是IPv4的地址格式,总长度 32位=4段*8位,每段之间用 . 分割, 每段都是0-255之间的十进制数值。

将0-255用正则表达式表示,可以分成一下几块来分别考虑:

IP地址格式可表示为:XXX.XXX.XXX.XXX,XXX取值范围是0-255,前三段加一个.重复了三次,再与最后一段合并 或者 前一段与加 . 重复三次的后三段合并,组成IP地址的完整格式。

# IP地址 正则表达如下:

一、
ip =r'^((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))$'

二、
ip = r'^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$'

六、shutil模块

高级的 文件、文件夹、压缩包 处理模块

shutil.copyfileobj(fsrc, fdst[, length])       将文件内容拷贝到另一个文件中

import shutil
 
shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))

shutil.copyfile(src, dst)        拷贝文件

shutil.copyfile('f1.log', 'f2.log')

shutil.copymode(src, dst)    仅拷贝权限。内容、组、用户均不变

shutil.copymode('f1.log', 'f2.log')

shutil.copystat(src, dst)    仅拷贝状态的信息,包括:mode bits, atime, mtime, flags

shutil.copymode('f1.log', 'f2.log')

shutil.copy(src, dst)    拷贝文件和权限

shutil.copymode('f1.log', 'f2.log')

shutil.copy2(src, dst)    拷贝文件和状态信息

shutil.copy2('f1.log', 'f2.log')

shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)      递归的去拷贝文件夹

shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))

shutil.rmtree(path[, ignore_errors[, onerror]])    递归的去删除文件

shutil.rmtree('folder1')

 shutil.move(src, dst)

递归的去移动文件,它类似mv命令,其实就是重命名。

shutil.make_archive(base_name, format,...)

创建压缩包并返回文件路径,例如:zip、tar

创建压缩包并返回文件路径,例如:zip、tar

# 将 /DjangoProJ/a/test 下的文件打包放置当前程序目录
import shutil
ret = shutil.make_archive("cc", 'gztar', root_dir='/DjangoProJ/a/test')
  
  
# 将 /DjangoProJ/a/test 下的文件打包放置 /DjangoProJ/a/目录
import shutil
ret = shutil.make_archive("/DjangoProJ/a/cc", 'gztar', root_dir='/DjangoProJ/a/test ')

七、hashlib模块

用于加密相关的操作,代替了md5模块和sha模块,主要提供 sha1, sha224, sha256, sha384, sha512, blake2b, blake2s和MD5等;

特点:

1.内容相同则hash运算结果相同,内容改变则hash值则改变

2.不可逆推

3.相同算法:无论校验多长的数据,得到的哈希值长度固定。

import hashlib
 
# ######## md5 ########
 
hash = hashlib.md5(bytes('898oaFs09f',encoding="utf-8"))
hash.update(bytes('admin',encoding="utf-8"))
print(hash.hexdigest())

八、json和pickle模块

前言

什么是序列化?

我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化

为什么要序列化?

持久保存状态:

  '状态'会以各种有结构的数据类型形式被保存在内存中;

  内存是无法永久保存数据的,程序运行了一段时间,断电或者重启内存则会清空程序这段段时间保存的数据;

  在断电或重启程序之前将程序当前内存中所有的数据都保存下来(保存到文件中),下次程序执行能够从文件中载入之前的数据继续执行,这就是序列化。

跨平台数据交互:

  序列化之后,不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,如果收发的双方约定好实用一种序列化的格式,那么打破了平台/语言差异化带来的限制,实现了跨平台数据交互。

  把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling;

Python中用于序列化的两个模块:json(用于【字符串】和 【python基本数据类型】 间进行转换)、pickle(用于【python特有的类型】 和 【python基本数据类型】间进行转换)

Json有四个功能:dumps、dump、loads、load

pickle也有四个功能:dumps、dump、loads、load

json使用:

import json
  dic={'name':'clint','age':18,'sex':''}
print(type(dic))    #<class 'dict'>
  j=json.dumps(dic)
print(type(j))      #<class 'str'>

f=open('序列化对象','w')
json.dump(dic,f)
f.close()

序列化和反序列化

import json

# 序列化
info = {'name':'clint','age':'18'}

with open('a','w') as f:
    f.write(json.dumps(info))

# 反序列化
with open('a','r') as f:
    info = json.loads(f.read())
    print(info)

pickle使用:

import pickle
 dic={'name':'clint','age':18,'sex':''}
 print(type(dic))    #<class 'dict'>
 j=pickle.dumps(dic)
 print(type(j))       #<class 'bytes'>

f=open('序列化对象_pickle','wb') #wb是写入bytes,j是'bytes'
pickle.dump(dic,f)
f.close()


# 反序列化
import pickle
f=open('序列化对象_pickle','rb')
data=pickle.loads(f.read())    # 等data=pickle.load(f)
print(data['age'])

九、configparser模块

configparser用于生成和修改常见配置文档,其本质上是利用open来操作文件

1、获取所有节点

import configparser
 
config = configparser.ConfigParser()
config.read('xxxooo', encoding='utf-8')
ret = config.sections()
print(ret)

2、获取指定节点所有键值对

import configparser
 
config = configparser.ConfigParser()
config.read('xxxooo', encoding='utf-8')
ret = config.items('section1')
print(ret)

3、获取指定节点下所有键

import configparser
 
config = configparser.ConfigParser()
config.read('xxxooo', encoding='utf-8')
ret = config.options('section1')
print(ret)

4、增删改查节点

import configparser

config = configparser.ConfigParser()
config.read('example.ini',encoding = 'utf-8')

#删除整个标题
config.remove_section('bitbucket.org')

#删除标题下的option
config.remove_option('topsecret.server.com','port')

#添加一个标题
config.add_section('info')
#在标题下添加options
config.set('info','name','clint')

#判断是否存在
print(config.has_section('info'))        #True
print(config.has_option('info','name'))    #True

#将修改的内容存入文件
config.write(open('new_example.ini','w'))

十、paramiko模块

paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,fabric和ansible内部的远程管理就是使用paramiko

下载安装:

# paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto
pip3 install pycrypto
pip3 install paramiko

使用:

# -*- coding:utf-8 -*-
# @Author  : Clint
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.178.1', 8000, 'clint', '123456')
stdin, stdout, stderr = ssh.exec_command('df')
print(stdout.read())
ssh.close()

# 执行命令 - 用户名+密码

十一、shelve模块

shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写,key必须为字符串,而值可以是python所支持的数据类型

import shelve

f=shelve.open(r'sheve.txt')
# f['stu1']={'name':'clint','age':18,'hobby':['basketball','sporting']}
# f['stu2']={'name':'eve','age':18,'hobby':'watching movie'}

print(f['stu1']['hobby'])
f.close()

十二、logging模块

用于便捷记录日志且线程安全的模块,python的logging模块提供了标准的日志接口,通过它存储各种格式的日志,logging的日志可以分为 debug、info、warning、error、critical5个级别

# -*- coding:utf-8 -*-
# @Author  : Clint
import logging

logging.basicConfig(filename='log.log',
                    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S %p',
                    level=10)

logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
logging.log(10, 'log')
logg.py
2019-05-18 10:01:23 AM - root - DEBUG -logg:  debug
2019-05-18 10:01:23 AM - root - INFO -logg:  info
2019-05-18 10:01:23 AM - root - WARNING -logg:  warning
2019-05-18 10:01:23 AM - root - ERROR -logg:  error
2019-05-18 10:01:23 AM - root - CRITICAL -logg:  critical
2019-05-18 10:01:23 AM - root - DEBUG -logg:  log
运行结果 logg.log

 

posted @ 2019-05-18 10:04  Utopia-Clint  阅读(300)  评论(0编辑  收藏  举报