Python模块

模块是Python最高级别的程序组织单元,他将程序代码和数据封装起来以便重用。

实际来看模块往往对应Python程序文件。本质就是用一些代码实现某些功能的集合

这个集合可以是一个.py文件,也可以是一个包(一个文件夹中,有一个.py入口文件)

一、导入模块

import module

from module.xx import xx

from module.xx import xx as rename

from module.xx import *

导入一个py文件,解释器解释该文件

导入一个包

导入模块根据路径 sys.path如果有该路径,就可直接导入

如果sys.path么有想要的路径,通过sys.path.append('路径')

二、开源模块

下载安装

1、yum、pip、apt-get

2、源码编译安装:Python setup.py build Python setup install

三、常用模块

1、os模块#用作系统级别的工作

os.popen('id').read()      # 执行系统命令得到返回结果

os.system()                # 得到返回状态 返回无法截取

os.name                    # 返回系统平台 Linux/Unix用户是'posix'

os.getenv()                # 读取环境变量

os.putenv()                # 设置环境变量

os.getcwd()                # 当前工作路径

os.chdir()                 # 改变当前工作目录

os.walk('/root/')          # 递归路径

文件处理

mkfifo()/mknod()       # 创建命名管道/创建文件系统节点

remove()/unlink()      # 删除文件

rename()/renames()     # 重命名文件

*stat()                # 返回文件信息

symlink()              # 创建符号链接

utime()                # 更新时间戳

tmpfile()              # 创建并打开('w+b')一个新的临时文件

walk()                 # 遍历目录树下的所有文件名

目录/文件夹

chdir()/fchdir()       # 改变当前工作目录/通过一个文件描述符改变当前工作目录

chroot()               # 改变当前进程的根目录

listdir()              # 列出指定目录的文件

getcwd()/getcwdu()     # 返回当前工作目录/功能相同,但返回一个unicode对象

mkdir()/makedirs()     # 创建目录/创建多层目录

rmdir()/removedirs()   # 删除目录/删除多层目录

访问/权限

saccess()              # 检验权限模式

chmod()                # 改变权限模式

chown()/lchown()       # 改变owner和groupID功能相同,但不会跟踪链接

umask()                # 设置默认权限模式

文件描述符操作

open()                 # 底层的操作系统open(对于稳健,使用标准的内建open()函数)

read()/write()         # 根据文件描述符读取/写入数据 按大小读取文件部分内容

dup()/dup2()           # 复制文件描述符号/功能相同,但是复制到另一个文件描述符

设备号

makedev()              # 从major和minor设备号创建一个原始设备号

major()/minor()        # 从原始设备号获得major/minor设备号

os.path模块

os.path.expanduser('~/.ssh/key')   # 家目录下文件的全路径

分隔

os.path.basename()         # 去掉目录路径,返回文件名

os.path.dirname()          # 去掉文件名,返回目录路径

os.path.join()             # 将分离的各部分组合成一个路径名

os.path.spllt()            # 返回(dirname(),basename())元组

os.path.splitdrive()       # 返回(drivename,pathname)元组

os.path.splitext()         # 返回(filename,extension)元组

信息

os.path.getatime()         # 返回最近访问时间

os.path.getctime()         # 返回文件创建时间

os.path.getmtime()         # 返回最近文件修改时间

os.path.getsize()          # 返回文件大小(字节)

查询

os.path.exists()          # 指定路径(文件或目录)是否存在

os.path.isabs()           # 指定路径是否为绝对路径

os.path.isdir()           # 指定路径是否存在且为一个目录

os.path.isfile()          # 指定路径是否存在且为一个文件

os.path.islink()          # 指定路径是否存在且为一个符号链接

os.path.ismount()         # 指定路径是否存在且为一个挂载点

os.path.samefile()        # 两个路径名是否指向同一个文件

2、sys模块#提供解释器相关操作

sys.argv              # 命令行参数List,第一个元素是程序本身路径

sys.exit(2)           # 退出脚本返回状态 会被try截取

sys.exc_info()        # 获取当前正在处理的异常类

sys.version           # 获取Python解释程序的版本信息

sys.maxint            # 最大的Int值  9223372036854775807

sys.maxunicode        # 最大的Unicode值

sys.modules           # 返回系统导入的模块字段,key是模块名,value是模块

sys.path              # 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值

sys.platform          # 返回操作系统平台名称

sys.stdout            # 标准输出

sys.stdin             # 标准输入

sys.stderr            # 错误输出

sys.exec_prefix       # 返回平台独立的python文件安装的位置

sys.stdin.readline()  # 从标准输入读一行

sys.stdout.write("a") # 屏幕输出a 

  

3、hashlib模块# 用于加密相关的操作

常规加密

import hashlib

hash_md5 = hashlib.md5()

hash_md5.update('admin')

print(hash_md5.hexdigest())

hash = hashlib.sha512()

hash.update('admin')

print hash.hexdigest()

#以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。

添加自定义key做加密

import hashlib

hash = hashlib.md5('898oaFs09f')

hash.update('admin')

print hash.hexdigest()

超屌加密-对我们创建的key和内容继续加密

import hmac

h = hmac.new('wueiqi')

h.update('hellowo')

print h.hexdigest()

4、json和pickle模块 #用于序列化数据

json,#json解决简单数据类型的序列换

pickle,#能存储python的复杂数据类型

Json模块提供了四个功能:dumps、dump、loads、load

pickle模块提供了四个功能:dumps、dump、loads、load

name_tra=json.dumps('[1,2,3,4,5]')  #dunmps将序列化的数据放到内存

with open('json_tra','wb') as f_json:

f_json.write(name_tra)

with open('json_tra1','wb') as f_json:#dump直接将内存中序列化的数据写入文件

json.dump(a,f_json)

time_now=datetime.datetime.now()

pickle_mem=p.dumps(time_now)

pickle_load=p.loads(pickle_mem)

5、subprocess模块

subprocess包来fork一个子进程,并运行一个外部的程序。

subprocess包中定义有数个创建子进程的函数。subprocess还提供了一些管理标准流(standard stream)和管道(pipe)的工具,从而在进程间使用文本通信。

subprocess.call()

父进程等待子进程完成

返回退出信息(returncode,相当于Linux exit code)

b=subprocess.call(['ls','-l'])

b=subprocess.call("ls -l",shell=True)

shell=True,允许shell命令是字符串形式。

subprocess.check_call()

父进程等待子进程完成

返回0

检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性,可用try…except…来检查

subprocess.check_call(["ls", "-l"])

subprocess.check_call("exit 1", shell=True)

subprocess.check_output()

父进程等待子进程完成

返回子进程向标准输出的输出结果

检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性和output属性,output属性为标准输出的输出结果,可用try…except…来检查

6、shuit模块 #文件的复制移动

shutil.copyfile('data.db', 'archive.db')             # 拷贝文件

shutil.move('/build/executables', 'installdir')      # 移动文件或目录

7、logging模块#格式化记录日志

#通过logging.basicConfig函数对日志的输出格式及方式做相关配置,日志将被写入文件

logging.basicConfig(level=logging.DEBUG,

format='%(asctime)s [line:%(lineno)d] %(levelname)s %(message)s',

datefmt='%Y/%m/%d %H:%M:%S',

filename='myapp.log',

filemode='a')

logging.debug('This is debug message')

logging.info('This is info message')

logging.warning('This is warning message')

#logging.basicConfig函数各参数:

#datefmt: 指定时间格式,同time.strftime()

#filename: 指定日志文件名

#filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'

#level: 设置日志级别,默认为logging.WARNING

#format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:

# %(asctime)s: 打印日志的时间

# %(levelname)s: 打印日志级别名称

# %(message)s: 打印日志信息

# %(levelno)s: 打印日志级别的数值

# %(lineno)d: 打印日志的当前行号

# %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]

# %(filename)s: 打印当前执行程序名

# %(funcName)s: 打印日志的当前函数

# %(thread)d: 打印线程ID

# %(threadName)s: 打印线程名称

# %(process)d: 打印进程ID

#将日志同时写入文件,并打印到屏幕

logging.basicConfig(level=logging.DEBUG,

                format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',

                datefmt='%Y/%m%d %H:%M:%S',

                filename='myapp.log',

                filemode='w')

#打印到屏幕

console = logging.StreamHandler()

console.setLevel(logging.WARNING)

formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')

console.setFormatter(formatter)

logging.getLogger().addHandler(console)

8、random模块 用于取随机数

random.choice(['apple', 'pear', 'banana'])   # 随机取列表一个参数

random.sample(xrange(100), 10)  # 不重复抽取10个

random.randrange(3,7) #随机抽取整数范围不包括7

random.random()                 # 随机浮点数

9、time datetime模块时间模块

时间戳  #1970年1月1日之后的秒,即:time.time()

格式化的字符串 # 2014-11-11 11:11,    即:time.strftime('%Y-%m-%d')

结构化时间   # 元组包含了:年、日、星期等... time.struct_time    即:time.localtime()

import time

time.time()                          # 时间戳[浮点]

time.localtime()[1] - 1              # 上个月

int(time.time())                     # 时间戳[整s]

time.strftime('%Y-%m-%d %X') #格式化输出时间

import datetime

datetime.datetime.datetime.now() #现在的时间

datetime.datetime.now() - datetime.timedelta(days=5,hours=3,seconds=3,minutes=2) #减时间

10、re模块 正则匹配

#Pattern对象是一个编译好的正则表达式,通过Pattern提供的一系列方法可以对文本进行匹配查找。

pattern=re.compile(strPattern[, flag]):

flag是匹配模式,re.I|re.M表示同时生效。

re.I(re.IGNORECASE): 忽略大小写

M(MULTILINE): 多行模式,改变'^'和'$'的行为

match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]): #结果匹配一次

#match(string[, pos[, endpos]])从string的pos下标处起尝试匹配pattern;如果pattern结束时仍可匹配,则返回一个Match对象;

pos和endpos的默认值分别为0和len(string);re.match()flags用于编译pattern时指定匹配模式。 

#re.match(pattern, string[, flags])不能指定pos和endpos值。所以匹配的是在开头进行匹配。

search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]): #结果匹配一次

#search(string[, pos[, endpos]])从string的pos下标处起尝试匹配pattern,如果pattern结束时仍可匹配,则返回一个Match对象;

若无法匹配,则将pos加1后重新尝试匹配;直到pos=endpos时仍无法匹配则返回None。 

#re.search(pattern, string[, flags]) ,用于匹配任意开始位

a='321.423.432.432 33.43.5.42 1.2.443.34  255.52.53.255 2.2.2.2 3.3.3.3'

pattern=re.compile(r'([12]?\d{1,2}\.){3}([12]?\d{1,2})')

print pattern.search(a).group()

split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]): 

按照能够匹配的子串将string分割后返回列表。maxsplit用于指定最大分割次数,不指定将全部分割。

#a='qwe123dsa43**   ***2*342rew'

#print re.split('[\d* ]+',a)

findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags]): 

搜索string,以列表形式返回全部能匹配的子串。

p = re.compile(r'\d+')

print p.findall('one1two2three3four4')

sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]): 

使用repl替换string中每一个匹配的子串后返回替换后的字符串。

count用于指定最多替换次数,不指定时全部替换。

a='321.423.432.432 33.43.5.42 1.2.443.34  255.52.53.255 2.2.2.2 3.3.3.3'

pattern=re.compile(r'([12]?\d{1,2}\.){3}([12]?\d{1,2})')

print pattern.sub('bibi',a)

finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]): 

搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。

a='321.423.432.432 33.43.5.42 1.2.443.34  255.52.53.255 2.2.2.2 3.3.3.3'

pattern=re.compile(r'([12]?\d{1,2}\.){3}([12]?\d{1,2})')

for i in pattern.finditer(a):

print(i.group())

未完待续,不喜请喷。