1、OS模块
#! -*- encoding:utf-8 -*-
#!/usr/bin/env python3
# OS model
import os # 调用模块
print(os.getcwd()) # 显示当前工作目录
os.chdir(r'/home/liu') # 切换工作目录 相当于 cd 命令
os.chdir(os.curdir) # .
os.chdir(os.pardir) # ..
os.makedirs(r'hah/hehe/lala') # 递归创建目录
os.removedirs(r'hah/hehe/lala') # 递归删除目录
os.mkdir(r'ha/a') # 创建单个目录
os.rmdir(r'ha') # 删除单个目录
ls = os.listdir(r'/home/liu') # 列出指定目录中的文件,以列表方式存储
print(ls)
os.remove(r'aaa') # 删除文件
os.rename('dddd','txt') # 修改文件名或目录名
info = os.stat(r'OS模块.py') # 获取文件信息 ,生成结构化对象 <class 'os.stat_result'>
print(info.st_size) # 取出对象某个信息
print(os.sep) # 获取当前系统目录分隔符 /
print(os.linesep) # 获取当前系统换行符
print(os.pathsep) # 获取当前系统环境变量分隔符 :
print(os.name) # 获取当前系统代号 win->nt linux->posix
os.system('ls') # 执行系统终端命令
print(os.environ) # 获取当前系统环境变量所有的值存到字典里
print(os.path.abspath('www')) # 获取指定目录绝对路径
di = os.path.split(r'/home/liu/python-learn/day18/OS模块.py') # 把指定文件路径和文件分割成元组
print(di)
print(os.path.dirname(r'/home/liu/python-learn/day18/OS模块.py')) # 获取指定文件上级绝对路径
print(os.path.basename(r'/home/liu/python-learn/day18/OS模块.py')) # 获取指定路径文件名
print(os.path.exists(r'/home/liu/python-learn/day18/OS模块.py')) # 指定文件名存在返回True否则返回False
print(os.path.isabs(r'OS模块.py')) # 判断是否是绝对路径
print(os.path.isfile(r'OS模块.py')) # 判断是否为文件
print(os.path.isdir(r'/home/liu/python-learn/day18/')) # 判断是否为文件夹
print(os.path.join(r'home/liu/python-learn/day18/',r'OS模块.py')) # 文件路径拼接
print(os.path.getatime(r'OS模块.py')) # 获取文件或目录最后访问时间
print(os.path.getmtime(r'OS模块.py')) # 获取文件或目录最后修改时间
print(os.path.getctime(r'OS模块.py'))
2、时间模块
#! -*- encoding:utf-8 -*-
import time,datetime
print(time.time()) # 打印时间戳 1512397277.3772018
time.sleep(1) # 程序暂停一秒钟
print(time.clock()) # 计算cpu执行时间 0.026972
print(time.gmtime()) # 获取世界时间,默认是英国UTM0 ,显示结构化时间
# time.struct_time(tm_year=2017, tm_mon=12, tm_mday=4, tm_hour=14, tm_min=23, tm_sec=34, tm_wday=0, tm_yday=338, tm_isdst=0)
print(time.localtime()) # 获取本地时间,结构化显示
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())) # 自定义时间输出格式 2017-12-04 22:26:03
t = time.strptime('2017-12-04 22:26:03', '%Y-%m-%d %H:%M:%S') # 将指定的时间和格式转换成结构化时间
print(t) # time.struct_time(tm_year=2017, tm_mon=12, tm_mday=4, tm_hour=22, tm_min=26, tm_sec=3, tm_wday=0, tm_yday=338, tm_isdst=-1)
print(t.tm_year) # 取出结构化时间的某个时间点 2017
print(t.tm_mon) # 12
print(time.ctime()) # 默认简约方式显示本地时间 # Mon Dec 4 22:41:05 2017
print(time.ctime(12345678900)) # 传入数值时间戳转化成简约时间显示
print(time.mktime(time.localtime())) # 把结构化时间转化成时间戳
print(datetime.datetime.now()) # 2017-12-04 22:44:47.233519 datetime模块显示时间
print(datetime.datetime.now() + datetime.timedelta(hours=1)) # 输出本地时间加一个小时,可以自定义加的时间
3、随机数模块
#! -*- encoding:utf-8 -*-
# 随机数模块
import random
print(random.random()) # 小于1的浮点随机数
print(random.randint(1,8)) # 限定范围的随机数,包含1和8
print(random.choice(['hello', 233, (32,55), {'haha':'hehe'}])) # 从一个序列里随机选出一个
print(random.sample(['hello', 233, (32,55), {'haha':'hehe'}], 2)) # 从一个序列里随机选出指定个
print(random.randrange(5)) # 规定范围的一个随机数,0-4 不包含5
4、SYS模块
在终端下才能加[选项]
#! -*- encoding:utf-8 -*-
# SYS模块
# 与python解释器交互
import sys
print(sys.argv) # 打印执行文件和选项,存在列表里 ['/media/liu/软件/python-learn/day18/SYS模块.py', '-d']
def d():
print('os')
if sys.argv[1] == '-d':
d() # os
print(sys.path) # 搜寻模块路径的列表 ['/media/liu/软件/python-learn/day18', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages']
print(sys.platform) # 打印当前系统平台 可以用作判断系统平台执行不同命令 #linux
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys, time
for i in range(50):
sys.stdout.write('=') # 动态的往屏幕输出字符
time.sleep(0.1)
sys.stdout.flush() # 输出一个刷新一次屏幕
5、加密模块
#! -*- encoding:utf-8 -*-
# 加密模块
import hashlib
m = hashlib.md5() # <md5 HASH object @ 0x7f2286191080> MD5加密的对象
m.update('hello world!'.encode('utf-8')) # 把字符串以utf8编码加密
print(m.hexdigest()) # fc3ff98e8c6a0d3087d515c0473f8677 以16进制输出加密后的字符串
m.update('liujun'.encode('utf-8'))
print(m.hexdigest()) # 18eee402c6822072c9e775ab52b0e635
# m1 = hashlib.md5() # 这一段注释的和上面两次加密的结果相同
# m1.update('hello world!liujun'.encode('utf-8'))
# print(m1.hexdigest()) # 18eee402c6822072c9e775ab52b0e635
#
s = hashlib.sha256() # sha256加密
s.update('hello world!'.encode('utf-8'))
print(s.hexdigest()) # 7509e5bda0c762d2bac7f90d758b5b2263fa01ccbc542ab5e3df163be08e6ca9
#!/usr/bin/env python3
# -*- encoding:utf-8 -*-
import hashlib
md5 = hashlib.md5(bytes('俊', encoding='utf-8')) # 这里可以加入自定的混淆字符
sha3 = hashlib.sha3_256('自定混淆字符'.encode('utf-8')) # 跟上面一样的效果,只是加密方式和混淆字符不同
md5.update(bytes('password', encoding='utf-8'))
print(md5.hexdigest()) # cc1d8b2c94ff7857236953054fa10767
sha3.update('password'.encode('utf-8'))
print(sha3.hexdigest()) # d99a8b13511c438cfd8f93b731188e420869dbebc3fef5b01172191987ea9e0a
###################################
# 上列字符编码解释实例
f = '俊'.encode('utf-8') # 这是直接以'utf-8'编译成字节类型
# f = '俊' # 这两句同上面是一样的效果
# f = bytes(f, encoding='utf-8')
print(f)
for i in f:
print(i, bin(i))
'''
俊
b'\xe4\xbf\x8a'
228 0b11100100
191 0b10111111
138 0b10001010
'''
6、日志模块
#! -*- encoding:utf-8 -*-
# 日志模块
import logging
logging.basicConfig(level=logging.DEBUG, # 改日志输出配置 没有这函数则默认输出到屏幕 WARNING:root:warning message
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a,%d %b %Y %H:%M:%S', # '%Y-%m-%d %H:%M:%S'
filename='loginfo.log', # 不指定文件则输出到屏幕
filemode='w' #
)
logging.debug('debug message') # Sun,26 Nov 2017 03:13:21 logging模块.py[line:19] DEBUG debug message
logging.info('info message') # #S un,26 Nov 2017 03:13:21 logging模块.py[line:20] INFO info message
logging.warning('warning message') # Sun,26 Nov 2017 03:13:21 logging模块.py[line:21] WARNING warning message
logging.error('error message') # Sun,26 Nov 2017 03:13:21 logging模块.py[line:22] ERROR error message
logging.critical('critical message') # Sun,26 Nov 2017 03:13:21 logging模块.py[line:23] CRITICAL critical message
#! -*- encoding:utf-8 -*-
# 日志模块 logger
# 同时输出到屏幕和文件
import logging
logger = logging.getLogger() # 生成一个getLogger对象
fh = logging.FileHandler('test.log', 'a') # 创建一个handler用于写入到文件;可以再创建一个文件对象,同时写入两个不同的文件
ch = logging.StreamHandler() # 创建一个handler用于输出到控制台
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 设置日志输出格式
fh.setFormatter(formatter) # 把格式代入fh
ch.setFormatter(formatter) # 把格式代入ch
logger.addHandler(fh) # 这里相当于输出日志的开关
logger.addHandler(ch) # 如果不想输出到屏幕,就注释这里
logger.setLevel(logging.DEBUG) # 等级
logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')
7、配置文件模块
#! -*- encoding:utf-8 -*-
# 配置文件模块
import configparser
# 创建
config = configparser.ConfigParser() # 创建配置文件对象
config['DEFAULT'] = { # 以字典形式把内容存进去
'ServerAliveInterval':'45', # 'DEFAULT'块 是一个特殊的块
'Compression':'yes',
'CompressionLevel':'9'
}
config['bitbucket.org'] = {} # 这一段是花式赋值
config['bitbucket.org']['User'] = 'hg'
config['topsecret.server.com'] = {}
topsecret = config['topsecret.server.com']
topsecret['Host Port'] = '50022'
topsecret['ForwardX11'] = 'no'
config['DEFAULT']['ForwardX11'] = 'yes'
with open('ex.ini','w') as configfile: # 写入指定文件
config.write(configfile)
# 读取
config = configparser.ConfigParser() # 创建配置文件对象
config.read('ex.ini') # 先读取配置文件对象
print(config.sections()) # 打印配置文件内容 ‘DEFAULT’块不打印 ['bitbucket.org', 'topsecret.server.com']
print(config.defaults()) # 打印默认参数 OrderedDict([('compressiofile:///home/liu/%E5%9B%BE%E7%89%87/2017-11-26%2005-32-45%20%E7%9A%84%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE.pngnlevel', '9'), ('compression', 'yes'), ('serveraliveinterval', '45'), ('forwardx11', 'yes')])
print('bitbucket.org' in config) # 还能做判断 True
print(config['DEFAULT']['ServerAliveInterval']) # 取值 45
for key in config['bitbucket.org']: # 遍历 注意:这里会把‘DEFAULT’块的键名也取出来
print(key)
# 删除
config = configparser.ConfigParser() # 创建配置文件对象
config.read('ex.ini')
config.remove_section('topsecret.server.com') # 删除指定项
config.remove_option('bitbucket.org','user') # 把bitbucket.org块user删掉
config.set('bitbucket.org','user','liujun') # 把bitbucket块user的值改成liujun
config.write(open('ex.ini','w')) # 重写入文件
print(config.has_section('topsecret.server.com')) # 判断是否存在; False
8、正则表达式
#! -*- encoding:utf-8 -*-
# 正则表达式 RE模块
import re
# . 任意单个字符,不包括换行符
# ^ 行首匹配
# $ 行尾匹配
# * 匹配前面字符任意次,零个到无穷个 ### +?*默认都是贪婪模式,在后面加个?就是懒惰模式
# + 匹配前面字符一个到无穷个
# ? 匹配前面字符零个或一个
# {} 指定匹配的个数,{2,4,7}默认贪婪模式 {2, } 2到任意个
# [] 匹配中括号内规定范围的单个字符 a-z范围 ^括号内所有取反 \ 字符全部去掉了特殊意义
# \ 反斜杠在python里有特殊意义,在RE里面也有特殊意义,使用时看情况使用r 转换
# \d 匹配任何十进制数
# \D 匹配任何非数字字符
# \s 匹配任何空白字符
# \S 匹配任何非空白字符
# \w 匹配任何字母数字字符
# \W 匹配任何非字母数字字符
# \b 匹配一个单词边界,也就是指单词和空格间的位置
# () 分组,把一个分组当成一个字符来匹配 这里findall只取分组里的内容,(?:\w)这样可以取消分组的优先级,显示全部匹配内容
# | 或
# findall
ret = re.findall('a{1,}b','aaaaaaabbaabbbababaaabbbb') # findall 匹配所有符合的字符串 返回到一个列表里
print(ret)
# search
ret1 = re.search(r'a\b','a gasda').group() # search 只匹配第一个匹配到的字符串 返回一个对象
print(ret1)
ret2 = re.search('(?P<id>\d{3})/(?P<name>\w{3})','weeew34ttt123/ooo') # ?P<名称> 给分组里内容命名的固定写法
print(ret2.group())
print(ret2.group('id')) # 单独取出分组里的值
print(ret2.group('name'))
# match
ret3 = re.match('asd','asdage4eg') # 跟search用法差不多,但只匹配行首的字符
print(ret3) # <_sre.SRE_Match object; span=(0, 3), match='asd'>
print(ret3.group())
# split
ret4 = re.split('[js]','sdjksal') # 以正则匹配分割字符
print(ret4)
r = re.split('(34)', '123456',1) # 可以通过分组(括号)保留用来分割的字符,后面可以指定分割次数
# sub
ret5 = re.sub('a..x','liujun','lkeoigo0alex0owi') # 以正则匹配替换字符串:lkeoigo0liujun0owi
print(ret5)
# compile
obj = re.compile('\.com') # 先把规则编译到一个对象里
ret6 = obj.findall('baidu.com google.com') # 如果多次使用同一规则,可使用compile方法
print(ret6) # ['.com', '.com']
# finditer
ret7 = re.finditer('\d','lsdjg3ja9j12l6j5') # 匹配结果存在迭代器里
print(next(ret7).group())
print(next(ret7).group())
print(next(ret7).group())
import re
s = 'hello alex bcd alex lge alex acd 19'
# 无分组
r =re.search('a\w+', s)
print(r.group()) # 获取匹配到的所有结果
print(r.groups()) # 获取模型中匹配到的分组结果
print(r.groupdict()) # 获取模型中命名的分组结果
'''
alex
()
{}
'''
# 有分组
r =re.search('a(\w+).*(?P<name>\d)$', s)
print(r.group()) # 获取匹配到的所有结果
print(r.groups()) # 获取模型中匹配到的分组结果
print(r.groupdict()) # 获取模型中命名的分组结果
'''
alex bcd alex lge alex acd 19
('lex', '9')
{'name': '9'}
'''
r = re.match('') # match 也有以上3种方法,但match特性只从开头字符匹配
import re
# findall如果没有括号(分组)的话,就匹配所有规则能匹配到的字符串放入列表。
# findall如果有括号(分组)的话,则只把括号内规则匹配到的放入列表,单个分组和多个分组也有区别;用'?:'可以取消分组的优先级,跟没分组一样
n = re.findall('\dasd', '1asd2asdp3asdxgra')
print(n) # ['1asd', '2asd', '3asd']
origin = 'hello alex alex bcd abcd lge acd 19'
# findall的查找是 由左至右 由外到内 的顺序查找的
r = re.findall('(a)((\w+)(e))(x)', origin) # findall 里面的分组找出来的字符就相当于search里面groups里的值
print(r) # [('a', 'le', 'l', 'e', 'x'), ('a', 'le', 'l', 'e', 'x')]
origin = 'hello alex alex bcd abcd lge acd 19'
# findall的查找是 由左至右 由外到内 的顺序查找的
r = re.finditer('(a)((\w+)(e))(?P<K1>x)', origin) # findall 里面的分组找出来的字符就相当于search里面groups里的值
print(r) # <callable_iterator object at 0x104087320>
for i in r:
print(i, i.group(), i.groups(), i.groupdict()) # finditer查找的内容会存放到迭代器里,并且有group等功能特性
# <_sre.SRE_Match object; span=(6, 10), match='alex'> alex ('a', 'le', 'l', 'e', 'x') {'K1': 'x'}
# <_sre.SRE_Match object; span=(11, 15), match='alex'> alex ('a', 'le', 'l', 'e', 'x') {'K1': 'x'}
import re
# 由于分组的特性,查找规则只有一个括号,查找出来连续一样的值就只取后面那一个,单个的组
# 由于'*'的规则是可有可无、贪婪的,所以还会用 空 去匹配,所以不符合规则的就会用空去匹配,末尾结束符也是一个空;实际使用中应该避免出现空
n = re.findall('(\dasd)*', '1asd2asdp3asdxgra')
print(n) # ['2asd', '', '3asd', '', '', '', '', '']
n = re.findall('(\dasd)(\dasd)*', '1asd2asdp3asdxgra')
print(n) # [('1asd', '2asd'), ('3asd', '')]
################
n = re.findall('(\w)+', 'liujun') # 用'+'就不会出现匹配空的情况发生
print(n) # ['n'] #
n = re.finditer('(\w)(\w)(\w)*', 'liujun')
for i in n:
print(i, i.groups()) # <_sre.SRE_Match object; span=(0, 6), match='liujun'> ('l', 'i', 'n')
9、输入密码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import getpass
user_name = input('username:')
pass_word = getpass.getpass('password:') # 输入密码,隐藏输入的字符(不显示在屏幕)
print(user_name, pass_word)
10、高级模块shutil
用于对文件的操作
#!/usr/bin/env python3
# -*- encoding:utf-8 -*-
import shutil
shutil.copyfileobj(open('date.xml', 'r'), open('new_date.xml', 'w')) # 将文件内容拷贝到另一个文件中
shutil.copyfile('test.xml', 'test1.xml') # 拷贝文件
shutil.copymode('ex.ini', 'home.xml') # 仅把权限拷贝到另一个文件上去
shutil.copystat('ex.ini', 'home.xml') # 仅拷贝状态信息
shutil.copy('date.xml', 'date_2.xml') # 拷贝文件和权限
shutil.copy2('date.xml', 'date_1.xml') # 拷贝文件和状态信息
shutil.copytree('lib', 'lib_dir', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
# 递归的拷贝文件夹,ignore参数是排除某些文件,symlinks是拷贝快捷方式的源文件
shutil.rmtree('lib_dir') # 递归的删除文件
shutil.move('lib', 'lib_copy') # 递归的移动文件或文件夹(重命名)
11、zipfile 压缩模块
import zipfile
# 压缩
z = zipfile.ZipFile('DATE.zip', 'w') # 创建压缩文件对象,a可以追加
z.write('date.xml') # 写入指定文件
z.write('date_2.xml')
# z.write('home.xml')
z.close() # 关闭文件
# 解压
z = zipfile.ZipFile('DATE.zip', 'r') # 创建读模式压缩对象
# z.extractall() # 解压全部文件
ret = z.namelist() # 获取压缩包里的文件名
print(ret) # ['date.xml', 'date_2.xml', 'home.xml']
z.extract('home.xml') # extract可以解压单独文件
z.close()
12、tarfile模块
#!/usr/bin/env python3
# -*- encoding:utf-8 -*-
import tarfile
# 打包
tar = tarfile.open('mytar.tar', 'w') # 创建tar包对象
tar.add('date.xml', arcname='d.xml') # 添加文件,arcname是改名后存入
tar.add('ex.ini', arcname='e.ini')
tar.close()
# 解包
tar = tarfile.open('mytar.tar', 'r')
# tar.extractall() # 解包全部文件,可以指定一个目录
r = tar.list() # 其他方法与zipfile模块类似
print(r)
tar.close()
13、用于执行终端命令的模块 subprocess
#!/usr/bin/env python3
# -*- encoding:utf-8 -*-
import subprocess
ret = subprocess.call(['uname', '-a']) # 指定系统终端指令,返回指令执行状态
print(ret)
ret1 = subprocess.check_call('uname -a', shell=True) # 功能与上面类似, 加上shell参数,即可以以字符串格式输入长组合命令,而不用列表
print(ret1)
ret2 = subprocess.check_output('name -a', shell=True) # 执行命令,如果成功则返回执行结果字节码,否则抛出异常
print(ret2) # 不直接显示执行结果
# 高端功能,输入进入某环境在接着输入
obj = subprocess.Popen('mkdir sub_test', shell=True, cwd='/Users/liu/Desktop') # cwd参数功能是切换到指定目录执行命令
###############
obj1 = subprocess.Popen(['python3'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
# 创建一个提供3个通道的对象,stdin是输入,stdout是输出,stderr错误信息。执行指定命令后,可以通过提供的通道继续操作;universal_newlines是提供通用换行符
obj1.stdin.write('print("这是标准输出演示")\n') # 在执行终端命令后写入标准输入
obj1.stdin.write('prirn("2")') # 这里故意输入错误代码,后面返回错误信息
obj1.stdin.close() # 关掉输入通道
terminal_out = obj1.stdout.read() # 获取标准输出对象
obj1.stdout.close() # 关闭
terminal_error = obj1.stderr.read() # 获取错误输出对象
obj1.stderr.close() # 关闭
print(terminal_out) # 显示终端输出的内容
print(terminal_error) # 显示终端输出的错误信息
###############第二种方法,简单的读取标准输出##############
obj1 = subprocess.Popen(['python3'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
# 创建一个提供3个通道的对象,stdin是输入,stdout是输出,stderr错误信息。执行指定命令后,可以通过提供的通道继续操作;universal_newlines是提供通用换行符
obj1.stdin.write('print("这是标准输出演示")\n') # 在执行终端命令后写入标准输入
obj1.stdin.write('prirn("2")') # 这里故意输入错误代码,后面返回错误信息
out_error_list = obj1.communicate()
print(out_error_list) # 结果以元组形式存放
# ('这是标准输出演示\n', 'Traceback (most recent call last):\n File "<stdin>", line 2, in <module>\nNameError: name \'prirn\' is not defined\n')
################## 第三种形式########################
obj1 = subprocess.Popen(['python3'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
universal_newlines=True)
out = obj1.communicate('print("hello world!")\n') # 这里直接在communicate参数中输入
print(out) # ('hello world!\n', '')