您的位置:首页 > 编程语言 > Python开发

Python之模块应用

2017-12-04 23:55 218 查看

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)             # 搜寻模块路径的列表
d913
['/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', '')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: