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', '')
相关文章推荐
- python 闯关之路二(模块的应用)
- python应用regex正则表达式模块re
- Python的logging模块在Django中的应用
- python应用regex正则表达式模块re
- [转] Python中RE模块的应用
- python中的logging模块应用
- python warnings模块的简单应用
- Python模块学习之hashlib-MD5在接口测试中的应用
- 基础入门_Python-模块和包.深入Celery之应用配置/独立模块配置实践?
- Python3之反射及反射在模块上的应用
- Python可视化的扩展模块matplotlib的简单应用
- Python: pyautogui模块和pyperclip模块的应用--绕开VMware console 禁用粘贴板
- Red Hat/Fedora Linux 上应用 yum 安装 python pip 模块
- Python中RE模块的应用
- 装饰器应用,Python模块学习之(__call__)实现准确计算函数运行时间
- python os 模块的应用
- python字符串编码识别模块chardet简单应用
- python全栈开发-常用模块的一些应用
- python - os模块的应用
- python的re模块应用实例