Python-常用模块


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())
 

评论关闭