- 模块介绍
- time &datetime模块
- random
- os
- sys
- shutil
- json & picle
- shelve
- xml处理
- yaml处理
- configparser
- hashlib
- subprocess
- logging模块
模块就是一个功能的集合。
模块就和乐高积木差不多,你用这些模块组合出一个模型,然后也可以用这个模块加上其他的模块组合成一个新的模型
模块的种类:
1、内置模块(python自带的比如os、file等模块)
2、自定义模块,自己写的模块
3、第三方模块
模块的导入:
import module #导入模块下的全部模块 from module.xx.xx import * #导入模块下的全部模块 from module.xx.xx import xx #导入某块下的指定模块 from module.xx.xx import xx as rename #导入指定模块并给他设置别名
1、os用于提供系统级别的操作
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir(
"dirname"
) 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: (
'.'
)
os.pardir 获取当前目录的父目录字符串名:(
'..'
)
os.makedirs(
'dirname1/dirname2'
) 可生成多层递归目录
os.removedirs(
'dirname1'
) 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir(
'dirname'
) 生成单级目录;相当于shell中mkdir dirname
os.rmdir(
'dirname'
) 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir(
'dirname'
) 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename(
"oldname"
,
"newname"
) 重命名文件
/
目录
os.stat(
'path/filename'
) 获取文件
/
目录信息
os.sep 输出操作系统特定的路径分隔符,win下为
"\\",Linux下为"
/
"
os.linesep 输出当前平台使用的行终止符,win下为
"\t\n"
,Linux下为
"\n"
os.pathsep 输出用于分割文件路径的字符串
os.name 输出字符串指示当前使用平台。win
-
>
'nt'
; Linux
-
>
'posix'
os.system(
"bash command"
) 运行shell命令,直接显示
os.environ 获取系统环境变量
os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分割成目录和文件名二元组返回
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path) 如果path存在,返回
True
;如果path不存在,返回
False
os.path.isabs(path) 如果path是绝对路径,返回
True
os.path.isfile(path) 如果path是一个存在的文件,返回
True
。否则返回
False
os.path.isdir(path) 如果path是一个存在的目录,则返回
True
。否则返回
False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
2、sys用于提供对解释器相关的操作
sys.argv 命令行参数
List
,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(
0
)
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的
Int
值
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.stdout.write(
'please:'
)
val
=
sys.stdin.readline()[:
-
1
]
3、hashlib
mport hashlib
# ######## md5 ########
hash
=
hashlib.md5()
hash
.update(
'shuaige'
)
print
hash
.hexdigest()
>>>
import
hashlib
>>>
hash
=
hashlib.md5()
>>>
hash
.update(
'shuaige'
)
>>>
print
hash
.hexdigest()
37d2b9990df5a6843caf19352fee42a6
# ######## sha1 ########
hash
=
hashlib.sha1()
hash
.update(
'shuaige'
)
print
hash
.hexdigest()
>>>
hash
=
hashlib.sha1()
>>>
hash
.update(
'shuaige'
)
>>>
print
hash
.hexdigest()
fdb58cf91e7291b67815440281e4154e87747b68
# ######## sha256 ########
hash
=
hashlib.sha256()
hash
.update(
'shuaige'
)
print
hash
.hexdigest()
>>>
hash
=
hashlib.sha256()
>>>
hash
.update(
'shuaige'
)
>>>
print
hash
.hexdigest()
0dc6e2b03447ac1fde5a8ae5f9d609b2b37f26f5c8aeec5d244dde6184fde90d
# ######## sha384 ########
hash
=
hashlib.sha384()
hash
.update(
'shuaige'
)
print
hash
.hexdigest()
>>>
hash
=
hashlib.sha384()
>>>
hash
.update(
'shuaige'
)
>>>
print
hash
.hexdigest()
6dd79c38dc27c8f69411c2e77face2209606e08702fcbe7c5f73bb9e6a9ef1f58890156604ad6c71581dc5b6f7aea85e
# ######## sha512 ########
hash
=
hashlib.sha512()
hash
.update(
'shuaige'
)
print
hash
.hexdigest()
>>>
hash
=
hashlib.sha512()
>>>
hash
.update(
'shuaige'
)
>>>
print
hash
.hexdigest()
e9c94882cb0d9c61919f4d4c539a8bafe5f5a0708d214fbd50343c1e96a01ebb732883d0b0b36bff1e542cff69071395f511650944561807488700c71fb06338
以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
hash
=
hashlib.md5(
'898oaFs09f'
)
hash
.update(
'shuaige'
)
print
hash
.hexdigest()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
>>>
hash
=
hashlib.md5(
'898oaFs09f'
)
#这里把自定义的信息加上然后在进行加密
>>>
hash
.update(
'shuaige'
)
>>>
print
hash
.hexdigest()
6d1233c4e14a52379c6bc7a045411dc3
4、json 和 pickle
用于序列化的两个模块
json,用于字符串 和 python数据类型间进行转换
pickle,用于python特有的类型 和 python的数据类型间进行转换
json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
json dumps把数据类型转换成字符串 dump把数据类型转换成字符串并存储在文件中 loads把字符串转换成数据类型 load把文件打开从字符串转换成数据类型
pickle同理
现在有个场景在不同设备之间进行数据交换很low的方式就是传文件,dumps可以直接把服务器A中内存的东西发给其他服务器,比如B服务器、
在很多场景下如果用pickle的话那A的和B的程序都的是python程序这个是不现实的,很多时候都是不同的程序之间的内存交换怎么办?就用到了json(和html类似的语言)
并且josn能dump的结果更可读,那么有人就问了,那还用pickle做什么不直接用josn,是这样的josn只能把常用的数据类型序列化(列表、字典、列表、字符串、数字、),比如日期格式、类对象!josn就不行了。
为什么他不能序列化上面的东西呢?因为josn是跨语言的!
例子如下:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
__author__ = 'luotianshuai'
import json
test_dic = {'name':'luotianshuai','age':18}
print '未dumps前类型为:',type(test_dic)
#dumps 将数据通过特殊的形式转换为所有程序语言都识别的字符串
json_str = json.dumps(test_dic)
print 'dumps后的类型为:',type(json_str)
#loads 将字符串通过特殊的形式转为python是数据类型
new_dic = json.loads(json_str)
print '重新loads加载为数据类型:',type(new_dic)
print '*' * 50
#dump 将数据通过特殊的形式转换为所有语言都识别的字符串并写入文件
with open('test.txt','w') as openfile:
json.dump(new_dic,openfile)
print 'dump为文件完成!!!!!'
#load 从文件读取字符串并转换为python的数据类型
with open('test.txt','rb') as loadfile:
load_dic = json.load(loadfile)
print 'load 并赋值给load_dic后的数据类型:',type(load_dic)
5、ConfigParser
用于对特定的配置进行操作,当前模块的名称在 python 3.x 版本中变更为 configparser。
[section1]
k1
=
v1
k2:v2
[section2]
k1
=
v1
6、操作系统相关命令:
可以执行shell命令的相关模块和函数有:
- os.system
- os.spawn*
- os.popen* --废弃
- popen2.* --废弃
- commands.* --废弃,3.x中被移除
import commands testmodel = commands.getoutput('fdisk -l ') #获取用户的输出结果(结果以字符串存储) type(testmodel) #<type 'str'> commands.getstatus('/etc/passwd') #判断文件是否存在,存在返回不存在报错 #'-rw-r--r-- 1 root root 1196 Oct 19 20:15 /etc/passwd' commands.getstatus('/etc/passwdsd') #'ls: cannot access /etc/passwdsd: No such file or directory' result = commands.getstatusoutput('cmd') #获取用户的输出结果和状态正确状态为:0
以上执行shell命令的相关的模块和函数的功能均在 subprocess 模块中实现,并提供了更丰富的功能。建议以后使用此方法来执行系统命令:
call :执行命令,输出和状态码,如果正确状态码为0,错误为大于0的值!
import subprocess subprocess.call(["ls",'-l','/etc/'],shell=False) #使用python执行shell命令shell=False subprocess.call(‘ls -l /etc/ ’,shell=True) #使用原生的shell执行命令shell=True #一般建议统一使用python执行shell命名除非python没有的,在建议使用shell原生执行
check_call:执行命令,如果执行状态码是 0 ,则返回0,否则抛异常
import subprocess >>>subprocess.call(["ls",'-l','/etc/'],shell=False) #执行成功返回状态码0 >>>subprocess.call(["ls",'-l','/etc/sdfsdf'],shell=False) #执行错误直接报异常
check_output:执行命令,如果状态码是 0 ,则返回执行结果,否则抛异常
>>> subprocess.check_output(["echo", "Hello World!"]) #执行结果成功状态码是0直接返回结果 'Hello World!\n' >>> subprocess.check_output(["echo1", "Hello World!"]) #执行结果失败状态码不为0直接报错
subprocess.Popen(...) :用于执行复杂的系统命令
import subprocess ret1 = subprocess.Popen(["mkdir","t1"]) ret2 = subprocess.Popen("mkdir t2", shell=True)
6、shutil 高级的 文件、文件夹、压缩包 处理模块
高级的 文件、文件夹、压缩包 处理模块
shutil.copyfileobj(fsrc, fdst[, length])
将文件内容拷贝到另一个文件中,可以部分内容
>>> s = file('test.py','rb') >>> d = file('new.py','wb') >>> shutil.copy shutil.copy( shutil.copyfile( shutil.copymode( shutil.copytree( shutil.copy2( shutil.copyfileobj( shutil.copystat( >>> shutil.copy shutil.copy( shutil.copyfile( shutil.copymode( shutil.copytree( shutil.copy2( shutil.copyfileobj( shutil.copystat( >>> shutil.copyfileobj(s,d) >>> d.close() >>> exit() root@tim:/opt# ls new.py test.py root@tim:/opt#
shutil.copyfile(src, dst)
拷贝文件
>>> import shutil >>> shutil.copyfile('new.py','newnew.py') >>> import subprocess subprocess.Popen(['ls','-l']) <subprocess.Popen object at 0x7f533f61c090> >>> total 12 -rw-r--r-- 1 root root 53 Dec 7 22:38 newnew.py -rw-r--r-- 1 root root 53 Dec 7 22:35 new.py -rwxr-xr-x 1 root root 53 Dec 7 22:32 test.py
shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:
import zipfile # 压缩 z = zipfile.ZipFile('laxi.zip', 'w') z.write('a.log') z.write('data.data') z.close() # 解压 z = zipfile.ZipFile('laxi.zip', 'r') z.extractall() z.close() import tarfile # 压缩 tar = tarfile.open('your.tar','w') tar.add('/Users/wupeiqi/PycharmProjects/bbs2.zip', arcname='bbs2.zip') tar.add('/Users/wupeiqi/PycharmProjects/cmdb.zip', arcname='cmdb.zip') tar.close() # 解压 tar = tarfile.open('your.tar','r') tar.extractall() # 可设置解压地址 tar.close()
7、日志模块
用于便捷记录日志且线程安全的模块
import logging def log_models(logname,infos): logger = logging.getLogger(logname) #定义username logger.setLevel(logging.DEBUG) #定义全局日志级别 ch = logging.StreamHandler() #定义屏幕日志 ch.setLevel(logging.DEBUG) #定义屏幕日志级别 fh = logging.FileHandler('log.txt') #定义日志保存文件 fh.setLevel(logging.DEBUG) #定义文件日志保存级别 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") ch.setFormatter(formatter) #屏幕输出格式套用自定义的日志格式 fh.setFormatter(formatter) #日志输出格式套用自定义的日志格式 logger.addHandler(ch) #把屏幕输出日志交给logger接口执行 logger.addHandler(fh)#把文件输出日志交给logger接口执行 logger.debug(infos) #调用日志模块
对于等级:
CRITICAL = 50 FATAL = CRITICAL ERROR = 40 WARNING = 30 WARN = WARNING INFO = 20 DEBUG = 10 NOTSET = 0