常用模块
random
import random
l = [1,2,3,4,5,6]
l1 = random.shuffle(l) #将序列的所有元素随机排序。
print (l)
#生成一个6位字母的随机验证码
import random
li = []
for num in range(6):
i = random.randrange(65, 91)
print(i)
c = chr(i) #chr()函数用一个范围在range(256)内的(就是0~255)整数作参数,返回一个对应的字符。
li.append(c)
re = "".join(li) #拼接
print (re)
#生成6位字母数字随机验证码
import random
li = []
for i in range(6):
r = random.randrange(0,5) ##生成随机数,
if r == 3 or r == 4:
d = random.randrange(0, 10)
li.append(str(d)) ###由于下面要 join,而join只能是字符串,所以加str
else:
d = random.randrange(65,91)
c = chr(d)
li.append(c)
re = "".join(li)
print (re)
####
import random
print (random.choice("adasfewewdd")) #从字符串中随机选择一个
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所指向的文件或者目录的最后修改时间
time模块
print (time.ctime()) ###当前系统时间 print (time.time()) t1 = time.localtime(time.time()) #本地时间 print (time.localtime(time.time())) print ("{year}-{month}-{hour}".format(year=t1.tm_year,month=t1.tm_mon,hour=t1.tm_hour)) #自定义时间 print (time.mktime()) ###将时间对象转化为时间戳 time.sleep(4) ####延迟4秒 print (time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())) ### 按指定的时间格式输出 print (time.strptime("2016/01/01","%Y/%m/%d")) ####将字符串格式转换成struct time 格式 import time print (time.localtime()) 打印结果: time.struct_time(tm_year=2017, tm_mon=5, tm_mday=7, tm_hour=12, tm_min=39, tm_sec=25, tm_wday=6, tm_yday=127, tm_isdst=0) ###打印时间戳 print (time.time()) 打印结果: 1494132051.0743935 ##打印格式化的时间(元组) print (time.gmtime()) 打印结果: time.struct_time(tm_year=2017, tm_mon=5, tm_mday=7, tm_hour=4, tm_min=42, tm_sec=26, tm_wday=6, tm_yday=127, tm_isdst=0)
import time print (time.gmtime()) ###时间戳转换为元组传递当前时间元组(标准时间) print (time.localtime()) ###时间戳转换为元组传递本地时间到元组形式(本地时间) x = time.localtime() print (x.tm_year,x.tm_mon,x.tm_mday,x.tm_hour) ###单独打印时间 打印结果: time.struct_time(tm_year=2017, tm_mon=5, tm_mday=7, tm_hour=5, tm_min=53, tm_sec=20, tm_wday=6, tm_yday=127, tm_isdst=0) time.struct_time(tm_year=2017, tm_mon=5, tm_mday=7, tm_hour=13, tm_min=53, tm_sec=20, tm_wday=6, tm_yday=127, tm_isdst=0) 2017 5 7 13
mktime() ####将元组转换为时间戳 x = time.localtime() print (x.tm_year,x.tm_mon,x.tm_mday,x.tm_hour) print (time.mktime(x)) 打印结果: 2017 5 7 13 1494136624.0 元组转化为字符串 (strftime()) 语法:strftime(format,struct_time) -----> 转化为字符串 x = time.localtime() print (x) print (time.strftime("%Y-%m-%d %H:%M:%S",x)) 打印结果: time.struct_time(tm_year=2017, tm_mon=5, tm_mday=7, tm_hour=14, tm_min=14, tm_sec=56, tm_wday=6, tm_yday=127, tm_isdst=0) 2017-05-07 14:14:56 字符串时间转化为元组:(strptime) 语法:strptime("格式化字符串","时间格式") ------> 转化为元组 print (time.strptime('2017-08-20 17:12:12','%Y-%m-%d %H:%M:%S')) 打印结果: time.struct_time(tm_year=2017, tm_mon=8, tm_mday=20, tm_hour=17, tm_min=12, tm_sec=12, tm_wday=6, tm_yday=232, tm_isdst=-1) print (time.asctime()) ##接收一个元组作为参数 ctime() ####接收一个时间戳作为参数 打印结果: Sun May 7 14:52:46 2017 datetime模块 import datetime print (datetime.datetime.now()) ####获取当前时间 print (datetime.datetime.now()+datetime.timedelta(3)) ####获取几天前后几天后时间(3为3天后时间,-3为3天前时间# ) print (datetime.datetime.now()+datetime.timedelta(hours=3)) ####获取几天前后几天后时间(3为3小时后时间,-3为3小时前时间# ) print (datetime.date.today()) ###打印当前时间 print (datetime.date.fromtimestamp(time.time()))## print (datetime.datetime.now()) ####打印详细当前时间 print (datetime.datetime.now() + datetime.timedelta(days=10)) ###比现在加10天 print (datetime.datetime.now() + datetime.timedelta(days=-10)) ###比现在减10天 print (datetime.datetime.now() - datetime.timedelta(days=10)) ###比现在减10天 print (datetime.datetime.now() + datetime.timedelta(hours=10)) ###比现在加10小时 current_time = datetime.datetime.now() print (current_time.replace(2015,5)) ####回到某一天 print (datetime.datetime.strptime('21/11/06 16:40','%y/%m/%d %H:%M')) 结果: 2021-11-06 16:40:00
hashlib
import hashlib import base64 #####base64 加密与解密######### 加密 a = 'gaoxinjie@lavion.com.cn:LAVION@2017' jiami = base64.b64encode(a) print jiami #################解密#############333 s = 'Z2FveGluamllQGxhdmlvbi5jb20uY246TEFWSU9OQDIwMTc=' decode = base64.b64decode(s) print decode.decode() #########md5加盐加密################# hash = hashlib.md5(bytes('57136421',encoding='utf-8')) ####md5加盐 hash.update(bytes('123456',encoding='utf-8')) ### md5加密 result = hash.hexdigest() print (result) # ######## md5 ######## hash = hashlib.md5() hash.update('admin') print(hash.hexdigest()) # ######## sha1 ######## hash = hashlib.sha1() hash.update('admin') print(hash.hexdigest()) # ######## sha256 ######## hash = hashlib.sha256() hash.update('admin') print(hash.hexdigest()) # ######## sha384 ######## hash = hashlib.sha384() hash.update('admin') print(hash.hexdigest()) # ######## sha512 ######## hash = hashlib.sha512() hash.update('admin') print(hash.hexdigest())
subprocess
#!/usr/bin/env python #-*-coding:utf-8 -*- import subprocess obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/') ##在home目录下创建t3文件夹 obj1 = subprocess.Popen(['mkdir','t2']) ##在当前目录创建t2 文件夹 obj2 = subprocess.Popen(['mkdir','t3'],cwd='/root/') ##在root目录创建t3文件夹
terminate() 杀掉所启动进程
communicate() 等待任务结束
stdin 标准输入
stdout 标准输出
stderr 标准错误
shutil
shutil.copyfile(''源名称",'目的名称') ###拷贝文件 shutil.copy(''源名称",'目的名称') ###拷贝文件和权限 shutil.copytree(”src“,"dest") ###递归的去拷贝文件 shutil.make_archive(base_name,format(zip,tar..),要压缩的文件)
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]
xml
样例数据
<?xml version="1.0"?> <data> <country name="Liechtenstein"> <rank updated="yes">2</rank> <year>2008</year> <gdppc>141100</gdppc> <neighbor name="Austria" direction="E"/> <neighbor name="Switzerland" direction="W"/> </country> <country name="Singapore"> <rank updated="yes">5</rank> <year>2011</year> <gdppc>59900</gdppc> <neighbor name="Malaysia" direction="N"/> </country> <country name="Panama"> <rank updated="yes">69</rank> <year>2011</year> <gdppc>13600</gdppc> <neighbor name="Costa Rica" direction="W"/> <neighbor name="Colombia" direction="E"/> </country> </data>
处理脚本及打印结果
import xml.etree.cElementTree as et tree = et.parse("aaaa") root = tree.getroot() for c in root: print (c.tag,c.attrib) for i in c: print (i.tag,i.text) for d in root.iter("year"): print (d.tag,d.text) 打印结果: country {'name': 'Liechtenstein'} rank 2 year 2008 gdppc 141100 neighbor None neighbor None country {'name': 'Singapore'} rank 5 year 2011 gdppc 59900 neighbor None country {'name': 'Panama'} rank 69 year 2011 gdppc 13600 neighbor None neighbor None year 2008 year 2011 year 2011
xml操作
import xml.etree.ElementTree as ET tree = ET.parse("xmltest.xml") root = tree.getroot() # 修改 for node in root.iter('year'): new_year = int(node.text) + 1 node.text = str(new_year) node.set("updated", "yes") tree.write("xmltest.xml") # 删除node for country in root.findall('country'): rank = int(country.find('rank').text) if rank > 50: root.remove(country) tree.write('output.xml') 创建xml: import xml.etree.ElementTree as ET new_xml = ET.Element("namelist") name = ET.SubElement(new_xml, "name", attrib={"enrolled": "yes"}) age = ET.SubElement(name, "age", attrib={"checked": "no"}) sex = ET.SubElement(name, "sex") sex.text = '33' name2 = ET.SubElement(new_xml, "name", attrib={"enrolled": "no"}) age = ET.SubElement(name2, "age") age.text = '19' et = ET.ElementTree(new_xml) # 生成文档对象 et.write("test.xml", encoding="utf-8", xml_declaration=True) ET.dump(new_xml) # 打印生成的格式
configparser
import configparser config = configparser.ConfigParser() config["DEFAULT"] = {'ServerAliveInterval': '45', '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' # mutates the parser topsecret['ForwardX11'] = 'no' # same here config['DEFAULT']['ForwardX11'] = 'yes' with open('example.ini', 'w') as configfile: config.write(configfile) 生成的结果为: [DEFAULT] compression = yes compressionlevel = 9 serveraliveinterval = 45 forwardx11 = yes [bitbucket.org] user = hg [topsecret.server.com] host port = 50022 forwardx11 = no 读: >>> import configparser >>> config = configparser.ConfigParser() >>> config.sections() [] >>> config.read('example.ini') ['example.ini'] >>> config.sections() ['bitbucket.org', 'topsecret.server.com'] >>> 'bitbucket.org' in config True >>> 'bytebong.com' in config False >>> config['bitbucket.org']['User'] 'hg' >>> config['DEFAULT']['Compression'] 'yes' >>> topsecret = config['topsecret.server.com'] >>> topsecret['ForwardX11'] 'no' >>> topsecret['Port'] '50022' >>> for key in config['bitbucket.org']: print(key) ... user compressionlevel serveraliveinterval compression forwardx11 >>> config['bitbucket.org']['ForwardX11'] 'yes'
logging模块
两种形式:打印到屏幕;写入到文件
日志级别
#默认的日志级别为warnning
debug()----》info()-----》warning(),-----》error() ------》 critical()
如果设置日志级别为debug,则可打印所有级别日志
如果设置日志级别为warning,则只打印warning error critical 三个级别的日志
示例:
import logging logging.basicConfig(filename='example.log',level=logging.INFO) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too')
打印结果(设置的日志级别为info,所以只打印info和warning)
灵活设置日志(仅限写入文件)
import logging logging.basicConfig(level=logging.DEBUG, #设置日志级别 format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', #设置日志格式,具体日志格式可看下面 datefmt='%a, %d %b %Y %H:%M:%S', #指定日期时间格式 filename='/tmp/test.log', filemode='w') #文件打开方式
#stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open('test.log','w')),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message')
#打印结果 cat /tmp/test.log Mon, 05 May 2014 16:29:53 test_logging.py[line:9] DEBUG debug message Mon, 05 May 2014 16:29:53 test_logging.py[line:10] INFO info message Mon, 05 May 2014 16:29:53 test_logging.py[line:11] WARNING warning message Mon, 05 May 2014 16:29:53 test_logging.py[line:12] ERROR error message Mon, 05 May 2014 16:29:53 test_logging.py[line:13] CRITICAL critical message
format参数中的格式化串
%(name)s Logger的名字 %(levelno)s 数字形式的日志级别 %(levelname)s 文本形式的日志级别 %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有 %(filename)s 调用日志输出函数的模块的文件名 %(module)s 调用日志输出函数的模块名 %(funcName)s 调用日志输出函数的函数名 %(lineno)d 调用日志输出函数的语句所在的代码行 %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示 %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数 %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 %(thread)d 线程ID。可能没有 %(threadName)s 线程名。可能没有 %(process)d 进程ID。可能没有 %(message)s用户输出的消息
logger对象
import logging
#创建logger对象 logger = logging.getLogger()
# 创建一个handler,用于写入日志文件 fh = logging.FileHandler('test.log') # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #格式对象,默认日志级别为warning
#获取格式对象 fh.setFormatter(formatter) ch.setFormatter(formatter)
logger.addHandler(fh) #logger对象可以添加多个fh和ch对象 logger.addHandler(ch)
#另一种写法
fh = logging.FileHandler('test.log')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
logger1=logging.Logger("file_name",level=logging.debug)
logger1.addHandler(fh)
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')
logging库提供了多个组件:Logger、Handler、Filter、Formatter。Logger对象提供应用程序可直接使用的接口,Handler发送日志到适当的目的地,Filter提供了过滤日志信息的方法,Formatter指定日志显示格式。
filter
限制只有满足过滤规则的日志才会输出。
比如我们定义了filter = logging.Filter('a.b.c'),并将这个Filter添加到了一个Handler上,则使用该Handler的Logger中只有名字带 a.b.c前缀的Logger才能输出其日志。
import logging logger = logging.getLogger() # 创建一个handler,用于写入日志文件 fh = logging.FileHandler('test.log') # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) ch.setFormatter(formatter) # 定义一个filter filter = logging.Filter('mylogger') fh.addFilter(filter) ch.addFilter(filter) # logger.addFilter(filter) logger.addHandler(fh) logger.addHandler(ch)
logger.setLevel(logging.DEBUG)
应用
import os import time import logging from config import settings def get_logger(card_num, struct_time): if struct_time.tm_mday < 23: file_name = "%s_%s_%d" %(struct_time.tm_year, struct_time.tm_mon, 22) else: file_name = "%s_%s_%d" %(struct_time.tm_year, struct_time.tm_mon+1, 22) file_handler = logging.FileHandler( os.path.join(settings.USER_DIR_FOLDER, card_num, 'record', file_name), encoding='utf-8' ) fmt = logging.Formatter(fmt="%(asctime)s : %(message)s") file_handler.setFormatter(fmt) logger1 = logging.Logger('user_logger', level=logging.INFO) logger1.addHandler(file_handler) return logger1