今日内容:
1.常用模块
2.面向对象编程(*****)
介绍面向对象编程
类
对象
3.内置函数
------------------------------
1.面向过程编程
核心“过程”二字,过程指的是解决问题的步骤,即先干什么再干什么后干什么
基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维方式
优点:复杂的问题流程化,进而简单化
缺点:可扩展性差
2.面向对象编程
核心“对象”二字,对象是特征与技能的结合体
基于该思想编程就好比创造出一个世界(世界是由一个个的对象组成的),你就是上帝
任何存在的事物都是对象,任何不存在的事物也可以创造出来
是一种上帝式的思维方式
优点:可扩展性强
缺点:编程的复杂度高
3.类
如果说对象是特征与技能的结合体,类则是一系列对象相似的特征与技能的结合体
在现实现实中:一定先有一个个具体存在的对象,然后随着人类文明的发展由人类站在不同的角度总结出来的类
注意:1.类是抽象的概念,而对象才是具体存在的事物
2.站在不同的角度,可以总结出不同的类
在程序中:一定是要先定义类,后调用类来产生对象
---------------------------------
站在老男孩选课系统的角度,总结现实世界中的老男孩学生对象
对象1:
特征:
学校='oldboy'
姓名='alex'
年龄=18
性别='male'
技能:
选课
对象2:
特征:
学校='oldboy'
姓名='andy'
年龄=19
性别='female'
技能:
选课
对象3:
特征:
学校='oldboy'
姓名='andy'
年龄=19
性别='female'
技能:
选课
对象4(老师):
特征:
学校='oldboy'
姓名='egon'
年龄=18
性别='male'
技能:
打分
站在老男孩选课系统的角度,总结现实世界中的老男孩学生类
老男孩的学生类:
相同的特征:
学校='oldboy'
相同的技能:
选课
站在程序的角度,一定先定义类,后调用类产生对象
1 #一.定义类 2 class OldboyStudent: 3 #相同的特征 4 school='oldboy' 5 #相同的技能 6 def choose_course(self): 7 print('is choosing course') 8 print('=========>') 9 #1.1 定义类会立刻触发类体代码的运行,会产生一个类的名称空间,将类体代码运行中产生名字的都丢到类的名称空间中 10 #ps:定义一个类本质就是创造了一个名称空间,用来存放名字的,即类相当于一个容器 11 print(OldboyStudent.__dict__) 12 print(OldboyStudent.__dict__['school']) 13 print(OldboyStudent.__dict__['choose_course']) 14 print(OldboyStudent.school) 15 print(OldboyStudent.choose_course('python')) #self位置参数必须传参数 16 17 OldboyStudent.school='OLDBOY' 18 print(OldboyStudent.__dict__) 19 OldboyStudent.country='China' 20 print(OldboyStudent.__dict__) 21 del OldboyStudent.country 22 print(OldboyStudent.__dict__)
输出:
=========>
{'__module__': '__main__', 'school': 'oldboy', 'choose_course': <function OldboyStudent.choose_course at 0x0000019295C7D2F0>, '__dict__': <attribute '__dict__' of 'OldboyStudent' objects>, '__weakref__': <attribute '__weakref__' of 'OldboyStudent' objects>, '__doc__': None}
oldboy
<function OldboyStudent.choose_course at 0x0000019295C7D2F0>
oldboy
is choosing course
None
{'__module__': '__main__', 'school': 'OLDBOY', 'choose_course': <function OldboyStudent.choose_course at 0x0000019295C7D2F0>, '__dict__': <attribute '__dict__' of 'OldboyStudent' objects>, '__weakref__': <attribute '__weakref__' of 'OldboyStudent' objects>, '__doc__': None}
{'__module__': '__main__', 'school': 'OLDBOY', 'choose_course': <function OldboyStudent.choose_course at 0x0000019295C7D2F0>, '__dict__': <attribute '__dict__' of 'OldboyStudent' objects>, '__weakref__': <attribute '__weakref__' of 'OldboyStudent' objects>, '__doc__': None, 'country': 'China'}
1 #二.调用类产生对象:调用类的过程称之为类的实例化,得到的结果是一个类的一个实例/对象 2 #调用类发生两件事: 3 #1.会先产生一个空对象 4 #2会触发类中__init__函数的运行,将空对象连同括号内的参数一同传入 5 class OldboyStudent: 6 #相同的特征 7 school='oldboy' 8 #相同的技能 9 def choose_course(self): 10 print('is choosing course') 11 print('=========>') 12 stu1=OldboyStudent() 13 stu2=OldboyStudent() 14 stu3=OldboyStudent() 15 print(id(stu1.school),id(stu2.school),id(stu2.school),id(OldboyStudent.school)) 16 print(id(stu1.choose_course),id(stu2.choose_course),id(stu2.choose_course),id(OldboyStudent.choose_course)) 17 18 stu1.name='alex' 19 stu1.age=18 20 stu1.sex='male' 21 22 stu2.name='tom' 23 stu2.age=20 24 stu2.sex='male' 25 26 stu3.name='sara' 27 stu3.age=30 28 stu3.sex='female' 29 30 #为每一个对象初始化自己独有的特征 31 def init(obj,x,y,z): 32 obj.name=x 33 obj.age=y 34 obj.sex=z 35 36 init(stu1,'alex',18,'male') 37 init(stu2,'tom',20,'male') 38 init(stu3,'sara',30,'female') 39 40 print(stu1.name) 41 print(stu2.name) 42 print(stu3.name)
输出:
=========>
1729089044808 1729089044808 1729089044808 1729089044808
1729071298248 1729071298248 1729071298248 1729089690480
alex
tom
sara
1 # 类是个名称空间,是个容器,用于存对象 2 class OldboyStudent: 3 #相同的特征 4 school='oldboy' 5 # stu1,'alex',18,'male' 6 def __init__(obj,name,age,sex): #__init__可调用类的时候自动触发函数运行 7 obj.name=name 8 obj.age=age 9 obj.sex=sex 10 print(obj,name,age,sex) 11 #相同的技能 12 def choose_course(self): 13 print('is choosing course') 14 print('=========>') 15 stu1=OldboyStudent('alex',18,'male') #stu1会作为obj默认传进__init__,所以不用传 16 print(stu1.__dict__) # 对象也是个名称空间,也是个容器,用于存对象特有的信息 17 stu2=OldboyStudent('tom',20,'male') 18 print(stu2.__dict__) # 对象也是个名称空间,也是个容器,用于存对象特有的信息 19 stu3=OldboyStudent('sara',30,'female') 20 print(stu3.__dict__) # 对象也是个名称空间,也是个容器,用于存对象特有的信息
输出:
=========>
<__main__.OldboyStudent object at 0x0000019295CA4DA0> alex 18 male
{'name': 'alex', 'age': 18, 'sex': 'male'}
<__main__.OldboyStudent object at 0x0000019295C96BA8> tom 20 male
{'name': 'tom', 'age': 20, 'sex': 'male'}
<__main__.OldboyStudent object at 0x0000019295C819E8> sara 30 female
{'name': 'sara', 'age': 30, 'sex': 'female'}
1 #对象本质就是一个容器(名称空间) 2 #类的本质也是一个容器(名称空间) 3 # 类是个名称空间,是个容器,用于存对象 4 class OldboyStudent: 5 x=1 6 school='oldboy' 7 # stu1,'alex',18,'male' 8 def __init__(self,name,age,sex): #__init__可调用类的时候自动触发函数运行,self用于自动接收第一个参数 9 self.name=name 10 self.age=age 11 self.sex=sex 12 print(self,name,age,sex) 13 def choose_course(self): 14 print('is choosing course') 15 print('=========>') 16 stu1=OldboyStudent('alex',18,'male') 17 stu2=OldboyStudent('tom',20,'male') 18 stu3=OldboyStudent('sara',30,'female') 19 #属性查找的顺序:对象的名称空间-》类的名称空间 20 stu1.x=222 21 print(stu1.x) 22 print(id(OldboyStudent.school),OldboyStudent.school) 23 print(id(stu1.school),stu1.school) 24 print(id(stu2.school),stu2.school) 25 print(id(stu3.school),stu3.school) 26 print('----------------------------------') 27 #类中定义的变量是类的数据属性,类的数据属性是共享给所有对象用 28 OldboyStudent.school='OLDBOY' 29 print(id(OldboyStudent.school),OldboyStudent.school) 30 print(id(stu1.school),stu1.school) 31 print(id(stu2.school),stu2.school) 32 print(id(stu3.school),stu3.school) 33 print('----------------------------------') 34 stu1.school='xxx' 35 print(id(OldboyStudent.school),OldboyStudent.school) 36 print(id(stu1.school),stu1.school) 37 print(id(stu2.school),stu2.school) 38 print(id(stu3.school),stu3.school) 39 #
输出:
=========>
<__main__.OldboyStudent object at 0x0000019295C81128> alex 18 male
<__main__.OldboyStudent object at 0x0000019295C812E8> tom 20 male
<__main__.OldboyStudent object at 0x0000019295C96EB8> sara 30 female
222
1729039486288 oldboy
1729039486288 oldboy
1729039486288 oldboy
1729039486288 oldboy
----------------------------------
1729089727600 OLDBOY
1729089727600 OLDBOY
1729089727600 OLDBOY
1729089727600 OLDBOY
----------------------------------
1729089727600 OLDBOY
1729043552328 xxx
1729089727600 OLDBOY
1729089727600 OLDBOY
1 #对象本质就是一个容器(名称空间) 2 #类的本质也是一个容器(名称空间) 3 # 类是个名称空间,是个容器,用于存对象 4 class OldboyStudent: 5 x=1 6 school='oldboy' 7 # stu1,'alex',18,'male' 8 def __init__(self,name,age,sex): #__init__可调用类的时候自动触发函数运行,self用于自动接收第一个参数 9 self.name=name 10 self.age=age 11 self.sex=sex 12 print(self,name,age,sex) 13 def choose_course(self): 14 print('%s is choosing course' %self.name) 15 print('=========>') 16 stu1=OldboyStudent('alex',18,'male') 17 stu2=OldboyStudent('tom',20,'male') 18 stu3=OldboyStudent('sara',30,'female') 19 #类定义的函数是类的函数属性,类可以使用,但类来用就是一个普通函数,必须遵循函数的规则 20 #但是,类中定义的函数其实是给对象用的,而非是绑定给对象用,称之为绑定方法 21 #绑定方法的特殊之处: 22 #绑定给谁就应该由谁类调用,谁来调用就会将谁当作第一个参数自动传入 23 print(OldboyStudent.choose_course) 24 #OldboyStudent.choose_course(123) 25 print(stu1.choose_course,id(stu1.choose_course)) 26 print(stu2.choose_course,id(stu2.choose_course)) 27 print(stu3.choose_course,id(stu3.choose_course)) 28 print(OldboyStudent.choose_course,id(OldboyStudent.choose_course)) 29 print('----------------------------------') 30 stu1.choose_course() 31 stu2.choose_course() 32 stu3.choose_course() 33 print(stu1,stu2,stu3)
输出:
=========>
<__main__.OldboyStudent object at 0x0000019295CA7E48> alex 18 male
<__main__.OldboyStudent object at 0x0000019295CA7E80> tom 20 male
<__main__.OldboyStudent object at 0x0000019295C81E80> sara 30 female
<function OldboyStudent.choose_course at 0x0000019295C6D8C8>
<bound method OldboyStudent.choose_course of <__main__.OldboyStudent object at 0x0000019295CA7E48>> 1729071613832
<bound method OldboyStudent.choose_course of <__main__.OldboyStudent object at 0x0000019295CA7E80>> 1729071613832
<bound method OldboyStudent.choose_course of <__main__.OldboyStudent object at 0x0000019295C81E80>> 1729071613832
<function OldboyStudent.choose_course at 0x0000019295C6D8C8> 1729089689800
----------------------------------
alex is choosing course
tom is choosing course
sara is choosing course
<__main__.OldboyStudent object at 0x0000019295CA7E48> <__main__.OldboyStudent object at 0x0000019295CA7E80> <__main__.OldboyStudent object at 0x0000019295C81E80>
1 #在python3中统一了类与类型的概念 2 class Foo: 3 pass 4 print(Foo) 5 print(list) 6 7 obj=Foo() 8 print(obj,type(obj)) 9 10 l1=[1,2,3] # 原理l=list([1,2,3]) l是对象,list是类 11 print(l.append) #原理l1.append(self,x), 绑定方法会自动传值,self=l1 12 l1.append(4) #对象调绑定方法,简便快捷 13 list.append(l1,5) #用类来调函数,使用麻烦,不够简便 14 print(l1) 15 16 l2=['a','b','c'] 17 l2.append('d') #原理l2.append(self,x), 绑定方法会自动传值,self=l2,#对象调绑定方法,简便快捷 18 list.append(l2,'e') #用类来调函数,使用麻烦,不够简便 19 print(l2)
输出:
<class '__main__.Foo'>
<class 'list'>
<__main__.Foo object at 0x0000019295C6C908> <class '__main__.Foo'>
<built-in method append of list object at 0x0000019295C7C548>
[1, 2, 3, 4, 5]
['a', 'b', 'c', 'd', 'e']
1 #演变过程 2 #1、在没有学习类这个概念时,数据与功能是分离的 3 def exc1(host,port,db,charset): 4 conn=connect(host,port,db,charset) 5 conn.execute(sql) 6 return xxx 7 8 9 def exc2(host,port,db,charset,proc_name) 10 conn=connect(host,port,db,charset) 11 conn.call_proc(sql) 12 return xxx 13 14 #每次调用都需要重复传入一堆参数 15 exc1('127.0.0.1',3306,'db1','utf8','select * from tb1;') 16 exc2('127.0.0.1',3306,'db1','utf8','存储过程的名字')
1 #2、我们能想到的解决方法是,把这些变量都定义成全局变量 2 HOST=‘127.0.0.1’ 3 PORT=3306 4 DB=‘db1’ 5 CHARSET=‘utf8’ 6 7 def exc1(host,port,db,charset): 8 conn=connect(host,port,db,charset) 9 conn.execute(sql) 10 return xxx 11 12 13 def exc2(host,port,db,charset,proc_name) 14 conn=connect(host,port,db,charset) 15 conn.call_proc(sql) 16 return xxx 17 18 exc1(HOST,PORT,DB,CHARSET,'select * from tb1;') 19 exc2(HOST,PORT,DB,CHARSET,'存储过程的名字')
1 #3、但是2的解决方法也是有问题的,按照2的思路,我们将会定义一大堆全局变量,这些全局变量并没有做任何区分,即能够被所有功能使用,然而事实上只有HOST,PORT,DB,CHARSET是给exc1和exc2这两个功能用的。言外之意:我们必须找出一种能够将数据与操作数据的方法组合到一起的解决方法,这就是我们说的类了 2 3 class MySQLHandler: 4 def __init__(self,host,port,db,charset='utf8'): 5 self.host=host 6 self.port=port 7 self.db=db 8 self.charset=charset 9 def exc1(self,sql): 10 conn=connect(self.host,self.port,self.db,self.charset) 11 res=conn.execute(sql) 12 return res 13 14 15 def exc2(self,sql): 16 conn=connect(self.host,self.port,self.db,self.charset) 17 res=conn.call_proc(sql) 18 return res 19 obj=MySQLHandler('127.0.0.1',3306,'db1') 20 obj.exc1('select * from tb1;') 21 obj.exc2('存储过程的名字')
1 #改进 2 class MySQLHandler: 3 def __init__(self,host,port,db,charset='utf8'): 4 self.host=host 5 self.port=port 6 self.db=db 7 self.charset=charset 8 self.conn=connect(self.host,self.port,self.db,self.charset) 9 def exc1(self,sql): 10 return self.conn.execute(sql) 11 12 def exc2(self,sql): 13 return self.conn.call_proc(sql) 14 15 16 obj=MySQLHandler('127.0.0.1',3306,'db1') 17 obj.exc1('select * from tb1;') 18 obj.exc2('存储过程的名字') 19 20 数据与专门操作该数据的功能组合到一起
常用模块:
序列
1.什么是序列化
序列化:就是将内存中的数据类型转换成一种中间格式,然后存放到文件中或者基于网络发送
反序列化:将文件中或者基于网络发送过来的数据转成应用程序中的数据类型
2.为何要序列化
1.数据类型的持久化
json:
优点:所有编程语言都可以识别的中间格式
缺点:无法
2.数据跨平台交付
1 #模拟序列化和反序列化 2 info={ 3 'name':'andy', 4 'age':18, 5 'sex"':'male' 6 } 7 8 with open('a.txt','wt',encoding='utf-8') as f: 9 f.write(str(info)) #序列化 10 11 with open('a.txt', 'rt', encoding='utf-8') as f: 12 data=f.read() 13 dic=eval(data) #反序列化 14 print(dic['name'])
输出:
andy
1 # 1. 序列化json.dumps-----反序列化json.loads 2 import json 3 info={ 4 'name':'egon', 5 'age':18, 6 'sex':None, 7 'is_beautifull':True, 8 } 9 10 info_json=json.dumps(info) 11 # print(info_json,type(info_json)) 12 with open('b.json','wt',encoding='utf-8') as f: 13 f.write(info_json) 14 #d=json.dumps({1,2,3}) 15 #print(d)
1 # 2. 序列化json.dump-----反序列化json.load 2 import json 3 with open('b.json',mode='rt',encoding='utf-8') as f: 4 dic=json.load(f) 5 print(dic,dic['name'])
输出:
{'name': 'egon', 'age': 18, 'sex': None, 'is_beautifull': True} egon
1 # 1. 序列化pkl.dumps-----反序列化pkl.loads 2 import pickle 3 info={ 4 'name':'egon', 5 'age':18, 6 'sex':None, 7 'is_beautifull':True, 8 } 9 with open('e.pkl','wb') as f: 10 pickle.dump(info,f) 11 pickle.dumps({1,2,3,4})
输出:
b'\x80\x03cbuiltins\nset\nq\x00]q\x01(K\x01K\x02K\x03K\x04e\x85q\x02Rq\x03.'
1 # 2. 序列化pkl.dumps-----反序列化pkl.loads 2 import json 3 with open('e.pkl','rb') as f: 4 dic=pickle.load(f) 5 print(dic,dic['age'])
输出:
{'name': 'egon', 'age': 18, 'sex': None, 'is_beautifull': True} 18
哈希库
hashlib模块
1. 什么是hash
hash是一种算法,该算法就相当于一个工厂,我们给工厂运算的原材料是一串字符或bytes
工厂加工的结果是一个hash值,hash值有三大特性:
1.只要传入的字符或bytes相同,得到的hash值必然相同
2.只要使用的hash算法是固定的,那得到的hash值的长度固定,即hash值不会随着校验内容的增多而变长
3.无法通过hash值逆推出校验的内容,
2.为何用hash
特点:1+2可以用来做文件完整性校验
3可以对密码进行加密
2.如何用
1 import hashlib 2 m=hashlib.md5() 3 m.update('hello'.encode('utf-8')) 4 m.update('world'.encode('utf-8')) 5 print(m.hexdigest()) #fc5e038d38a57032085441e7fe7010b0
输出:
fc5e038d38a57032085441e7fe7010b0
1 import hashlib 2 m1=hashlib.md5() 3 m1.update('helloworld'.encode('utf-8')) 4 print(m1.hexdigest()) #fc5e038d38a57032085441e7fe7010b0
输出:
fc5e038d38a57032085441e7fe7010b0
1 import hashlib 2 m2=hashlib.md5('andy'.encode('utf-8')) 3 m2.update('hello'.encode('utf-8')) 4 m2.update('world'.encode('utf-8')) 5 print(m2.hexdigest()) #4da782696c78031a0824ec1d773aebd1
输出:
4da782696c78031a0824ec1d773aebd1
1 import hashlib 2 m3=hashlib.sha512('andy'.encode('utf-8')) 3 m3.update('hello'.encode('utf-8')) 4 m3.update('world'.encode('utf-8')) 5 print(m3.hexdigest()) #e94ef8bb8db9100c609e370aeea2d53b7314c285be85b1e543cfd1013adcff68ba0c42aff341b028c9eaca4966ee383b6c9a517d1fab43f442ba38c17daa2441
输出:
e94ef8bb8db9100c609e370aeea2d53b7314c285be85b1e543cfd1013adcff68ba0c42aff341b028c9eaca4966ee383b6c9a517d1fab43f442ba38c17daa2441
1 import hashlib 2 pwd='andy123' 3 m4=hashlib.md5() 4 m4.update('天王盖地虎'.encode('utf-8')) 5 m4.update(pwd.encode('utf-8')) 6 print(m4.hexdigest()) #522ee028a8accc43ed18b7bc35f90e7d
输出:
522ee028a8accc43ed18b7bc35f90e7d
1 #time模块 2 import time 3 #1.时间戳 4 print(time.time()) 5 #2.格式化的字符串 6 print(time.strftime('%Y-%m-%d %H:%M:%S %p')) 7 print(time.strftime('%Y-%m-%d %X')) 8 #3.时间对象 9 print (time.localtime()) 10 print (time.gmtime()) 11 obj=time.localtime() 12 print(obj.tm_year,obj.tm_hour)
输出:
1533458800.0145576
2018-08-05 16:46:40 PM
2018-08-05 16:46:40
time.struct_time(tm_year=2018, tm_mon=8, tm_mday=5, tm_hour=16, tm_min=46, tm_sec=40, tm_wday=6, tm_yday=217, tm_isdst=0)
time.struct_time(tm_year=2018, tm_mon=8, tm_mday=5, tm_hour=8, tm_min=46, tm_sec=40, tm_wday=6, tm_yday=217, tm_isdst=0)
2018 16
1 #时间转换 2 #timestamp<----->struct_time 3 struct_time=time.localtime(3131313) 4 timestamp=time.mktime(struct_time) 5 print(timestamp) 6 #struct_time<----->timestamp 7 struct_time=time.strptime('2018:03-01','%Y:%m-%d') 8 print(struct_time) 9 print(time.strftime('%Y-%m-%d',struct_time)) 10 11 print(time.ctime()) 12 print(time.asctime())
输出:
3131313.0
time.struct_time(tm_year=2018, tm_mon=3, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=60, tm_isdst=-1)
2018-03-01
Sun Aug 5 16:56:17 2018
Sun Aug 5 16:56:17 2018
1 import datetime 2 print(datetime.datetime.now()) 3 print(datetime.datetime.fromtimestamp(1341313)) 4 print(datetime.datetime.now()+datetime.timedelta(days=3)) 5 print(datetime.datetime.now()+datetime.timedelta(days=-3)) 6 obj=datetime.datetime.now() 7 print(obj.replace(year=2017,month=3))
输出:
2018-08-05 17:11:32.951347
1970-01-16 20:35:13
2018-08-08 17:11:32.951347
2018-08-02 17:11:32.951347
2017-03-05 17:11:32.951347
1 import random 2 3 print(random.random())#(0,1)----float 大于0且小于1之间的小数 4 print(random.randint(1,3)) #[1,3] 大于等于1且小于等于3之间的整数 5 print(random.randrange(1,3)) #[1,3) 大于等于1且小于3之间的整数 6 print(random.choice([1,'23',[4,5]]))#1或者23或者[4,5] 7 print(random.sample([1,'23',[4,5]],2))#列表元素任意2个组合 8 print(random.uniform(1,3))#大于1小于3的小数,如1.927109612082716 9 10 item=[1,3,5,7,9] 11 random.shuffle(item) #打乱item的顺序,相当于"洗牌" 12 print(item)
输出:
0.48886600231751887
1
1
1
[1, '23']
1.5537879144360303
[9, 7, 5, 1, 3]
1 #生成8位随机验证码 2 import random 3 def make_code(n): 4 res='' 5 for i in range(n): 6 s1=chr(random.randint(65,90)) 7 s2=str(random.randint(0,9)) 8 res+=random.choice([s1,s2]) 9 return res 10 11 print(make_code(9))
输出:
C34T2CU61
1 #os模块 2 #os模块 3 os.getcwd() #获取当前工作目录,即当前脚本工作的目录路径 4 os.chdir("dirname") #改变当前脚本工作目录;相当于shell下cd 5 os.curdir #返回当前目录: ('.') 6 os.pardir #获取当前目录的父目录字符串名:('..') 7 os.makedirs('dirname1/dirname2') #可生成多层递归目录 8 os.removedirs('dirname1') #若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 9 os.mkdir('dirname') #生成单级目录;相当于shell中mkdir dirname 10 os.rmdir('dirname') #删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname 11 os.listdir('dirname') #列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 12 os.remove() #删除一个文件 13 os.rename("oldname","newname") #重命名文件/目录 14 os.stat('path/filename') #获取文件/目录信息 15 os.sep #输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/" 16 os.linesep #输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" 17 os.pathsep #输出用于分割文件路径的字符串 win下为;,Linux下为: 18 os.name #输出字符串指示当前使用平台。win->'nt'; Linux->'posix' 19 os.system("bash command") #运行shell命令,直接显示 20 os.environ #获取系统环境变量(****) 21 os.path.abspath(path) #返回path规范化的绝对路径 22 os.path.split(path) #将path分割成目录和文件名二元组返回 23 os.path.dirname(path) #返回path的目录。其实就是os.path.split(path)的第一个元素 24 os.path.basename(path) #返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 25 os.path.exists(path) #如果path存在,返回True;如果path不存在,返回False 26 os.path.isabs(path) #如果path是绝对路径,返回True 27 os.path.isfile(path) #如果path是一个存在的文件,返回True。否则返回False 28 os.path.isdir(path) #如果path是一个存在的目录,则返回True。否则返回False 29 os.path.join(path1[, path2[, ...]]) #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 30 os.path.getatime(path) #返回path所指向的文件或者目录的最后存取时间 31 os.path.getmtime(path) #返回path所指向的文件或者目录的最后修改时间 32 os.path.getsize(path) #返回path的大小
输出:
'C:\\Users\\andy'
1 #subprocess模块 2 import subprocess,time 3 obj=subprocess.Popen( 4 'tasklist', 5 shell=True, 6 stdout=subprocess.PIPE, 7 stderr=subprocess.PIPE 8 ) 9 print(obj.stdout.read()) 10 print(obj.stderr.read().decode('gbk'))
输出:
b'\r\n\xd3\xb3\xcf\xf1\xc3\xfb\xb3\xc6 PID \xbb\xe1\xbb\xb0\xc3\xfb \xbb\xe1\xbb\xb0# \xc4\xda\xb4\xe6\xca\xb9\xd3\xc3 \r\n========================= ======== ================ =========== ============\r\nSystem Idle Process 0 Services 0 8 K\r\nSystem 4 Services 0 220 K\r\nRegistry 96 Services 0 8,820 K\r\nsmss.exe 428 Services 0 348 K\r\ncsrss.exe 604 Services 0 1,028 K\r\nwininit.exe 708 Services 0 804 K\r\ncsrss.exe 716 Console 1 1,696 K\r\nservices.exe 780 Services 0 3,584 K\r\nlsass.exe 788 Services 0 8,848 K\r\nsvchost.exe 900 Services 0 328 K\r\nfontdrvhost.exe 924 Services 0 480 K\r\nsvchost.exe 940 Services 0 18,924 K\r\nsvchost.exe 1008 Services 0 13,188 K\r\nsvchost.exe 364 Services 0 1,944 K\r\nwinlogon.exe 520 Console 1 1,308 K\r\nfontdrvhost.exe 700 Console 1 1,820 K\r\ndwm.exe 1092 Console 1 36,572 K\r\nsvchost.exe 1184 Services 0 2,184 K\r\nsvchost.exe 1192 Services 0 424 K\r\nsvchost.exe 1280 Services 0 3,848 K\r\nsvchost.exe 1288 Services 0 520 K\r\nsvchost.exe 1312 Services 0 5,440 K\r\nsvchost.exe 1420 Services 0 608 K\r\nsvchost.exe 1552 Services 0 5,016 K\r\nsvchost.exe 1592 Services 0 3,152 K\r\nsvchost.exe 1712 Services 0 5,068 K\r\nsvchost.exe 1728 Services 0 2,192 K\r\nsvchost.exe 1788 Services 0 3,004 K\r\nsvchost.exe 1820 Services 0 1,140 K\r\nNVDisplay.Container.exe 1912 Services 0 1,292 K\r\nsvchost.exe 1920 Services 0 532 K\r\nsvchost.exe 1932 Services 0 1,456 K\r\nsvchost.exe 2032 Services 0 3,928 K\r\nsvchost.exe 720 Services 0 808 K\r\nsvchost.exe 1088 Services 0 396 K\r\nMemory Compression 2124 Services 0 454,544 K\r\ndasHost.exe 2160 Services 0 4,284 K\r\nNVDisplay.Container.exe 2216 Console 1 2,904 K\r\nsvchost.exe 2228 Services 0 592 K\r\nsvchost.exe 2248 Services 0 1,228 K\r\nsvchost.exe 2272 Services 0 428 K\r\nigfxCUIService.exe 2352 Services 0 896 K\r\nsvchost.exe 2420 Services 0 452 K\r\nsvchost.exe 2432 Services 0 1,768 K\r\nsvchost.exe 2440 Services 0 3,700 K\r\nsvchost.exe 2584 Services 0 508 K\r\nsvchost.exe 2612 Services 0 10,016 K\r\nsvchost.exe 2704 Services 0 3,420 K\r\nsvchost.exe 2720 Services 0 4,044 K\r\nRtkAudioService64.exe 2812 Services 0 984 K\r\nsvchost.exe 2924 Services 0 6,656 K\r\nsvchost.exe 2940 Services 0 2,364 K\r\nsvchost.exe 2948 Services 0 3,316 K\r\nsvchost.exe 2956 Services 0 1,312 K\r\nZhuDongFangYu.exe 2972 Services 0 2,264 K\r\nsvchost.exe 3024 Services 0 1,112 K\r\nsvchost.exe 3088 Services 0 2,960 K\r\nRAVBg64.exe 3284 Console 1 1,212 K\r\nsvchost.exe 3408 Services 0 1,224 K\r\nsvchost.exe 3608 Services 0 868 K\r\nspoolsv.exe 3692 Services 0 3,376 K\r\nsvchost.exe 3808 Services 0 1,084 K\r\naudiodg.exe 3960 Services 0 10,060 K\r\narmsvc.exe 3116 Services 0 1,268 K\r\nsvchost.exe 3176 Services 0 3,272 K\r\nsvchost.exe 3592 Services 0 17,112 K\r\nMiService.exe 3048 Services 0 16,096 K\r\nGfExperienceService.exe 3804 Services 0 1,220 K\r\ncheckrs.exe 3788 Services 0 852 K\r\nHuaweiHiSuiteService64.ex 4040 Services 0 1,316 K\r\nsvchost.exe 4048 Services 0 13,624 K\r\nEvtEng.exe 4056 Services 0 1,428 K\r\nNvNetworkService.exe 4100 Services 0 1,256 K\r\nsvchost.exe 4108 Services 0 1,292 K\r\nsvchost.exe 4116 Services 0 1,020 K\r\nibtsiva.exe 4124 Services 0 688 K\r\nsvchost.exe 4132 Services 0 372 K\r\nrscheck.exe 4140 Services 0 868 K\r\nQQProtect.exe 4152 Services 0 1,988 K\r\nsvchost.exe 4160 Services 0 448 K\r\nDolbyDAX2API.exe 4168 Services 0 2,300 K\r\nsvchost.exe 4188 Services 0 1,656 K\r\nRegSrvc.exe 4208 Services 0 1,108 K\r\nSecurityHealthService.exe 4280 Services 0 2,288 K\r\nUpdateService.exe 4332 Services 0 1,456 K\r\nSynTPEnhService.exe 4356 Services 0 604 K\r\nsvchost.exe 4376 Services 0 324 K\r\nUpdateService.exe 4392 Services 0 1,540 K\r\nvmware-authd.exe 4408 Services 0 4,024 K\r\nvmnetdhcp.exe 4428 Services 0 912 K\r\nvmware-usbarbitrator64.ex 4452 Services 0 1,256 K\r\nvmnat.exe 4460 Services 0 1,308 K\r\nsvchost.exe 4472 Services 0 3,164 K\r\nsvchost.exe 4480 Services 0 4,788 K\r\nZeroConfigService.exe 4500 Services 0 1,632 K\r\nsvchost.exe 4792 Services 0 1,420 K\r\nsvchost.exe 4800 Services 0 332 K\r\nvmware-hostd.exe 6044 Services 0 3,888 K\r\nunsecapp.exe 3832 Services 0 1,812 K\r\nWmiPrvSE.exe 6160 Services 0 1,576 K\r\nSynTPEnh.exe 6548 Console 1 6,036 K\r\nsihost.exe 6800 Console 1 17,940 K\r\nsvchost.exe 4064 Console 1 840 K\r\nsvchost.exe 6888 Console 1 13,192 K\r\ntaskhostw.exe 1328 Console 1 5,232 K\r\nsvchost.exe 5068 Services 0 1,048 K\r\nsvchost.exe 800 Services 0 896 K\r\nctfmon.exe 916 Console 1 11,684 K\r\nigfxEM.exe 2748 Console 1 1,608 K\r\nigfxHK.exe 2732 Console 1 1,120 K\r\nigfxTray.exe 2828 Console 1 1,532 K\r\nexplorer.exe 4224 Console 1 65,608 K\r\nSynTPHelper.exe 4388 Console 1 728 K\r\nsvchost.exe 4920 Services 0 1,652 K\r\nChsIME.exe 2256 Console 1 12,408 K\r\nsvchost.exe 7000 Services 0 5,732 K\r\ndllhost.exe 5652 Console 1 3,944 K\r\nsvchost.exe 5620 Services 0 2,996 K\r\nSearchUI.exe 7296 Console 1 16 K\r\nRuntimeBroker.exe 7396 Console 1 5,636 K\r\nRuntimeBroker.exe 7624 Console 1 3,832 K\r\nsmartscreen.exe 7860 Console 1 2,204 K\r\nsvchost.exe 7876 Services 0 3,696 K\r\nSearchIndexer.exe 7960 Services 0 32,876 K\r\nSkypeHost.exe 8148 Console 1 16 K\r\nWindowsInternal.Composabl 8376 Console 1 5,172 K\r\n360wpsrv.exe 8484 Console 1 8,540 K\r\nOfficeHubTaskHost.exe 8672 Console 1 16 K\r\nRuntimeBroker.exe 8920 Console 1 3,372 K\r\nREDAgent.exe 9808 Console 1 14,376 K\r\nePointer.exe 9924 Console 1 1,852 K\r\nnvtray.exe 9976 Console 1 1,648 K\r\nNvBackend.exe 10004 Console 1 6,660 K\r\nMSASCuiL.exe 9460 Console 1 1,308 K\r\nMiOSDApp.exe 10292 Console 1 1,408 K\r\nunsecapp.exe 10420 Console 1 1,956 K\r\nsvchost.exe 10476 Console 1 2,740 K\r\nMiTongBu.exe 10548 Console 1 9,548 K\r\nRuntimeBroker.exe 10712 Console 1 1,548 K\r\nguardhp.exe 10936 Console 1 1,988 K\r\nCastSrv.exe 11164 Console 1 1,824 K\r\nRtkNGUI64.exe 10868 Console 1 1,692 K\r\nRAVBg64.exe 10852 Console 1 1,564 K\r\nDolbyDAX2TrayIcon.exe 8008 Console 1 1,040 K\r\nOneDrive.exe 11444 Console 1 5,204 K\r\nRuntimeBroker.exe 11788 Console 1 2,164 K\r\nsvchost.exe 11888 Services 0 9,088 K\r\nbaidunetdisk.exe 11988 Console 1 61,240 K\r\nMobileDeviceSrv.exe 12228 Console 1 1,436 K\r\nbaidunetdiskhost.exe 7572 Console 1 1,460 K\r\nSgrmBroker.exe 7672 Services 0 8,788 K\r\nsvchost.exe 10692 Services 0 2,184 K\r\nyundetectservice.exe 9296 Console 1 1,680 K\r\nQQLive.exe 12424 Console 1 12,340 K\r\nRAVBg64.exe 12564 Console 1 1,052 K\r\nSogouSoftware.exe 12924 Console 1 23,100 K\r\nMiniThunderPlatform.exe 13244 Console 1 4,420 K\r\nvmware-tray.exe 12696 Console 1 1,472 K\r\nconcentr.exe 12764 Console 1 3,000 K\r\nReceiver.exe 12820 Console 1 3,916 K\r\n360tray.exe 9044 Console 1 44,060 K\r\nwfcrun32.exe 13216 Console 1 4,024 K\r\nCefSharp.BrowserSubproces 13036 Console 1 2,988 K\r\nSoftMgrLite.exe 14048 Console 1 7,924 K\r\nNavPlugin.exe 9300 Console 1 4,620 K\r\nLDSGameCenter.exe 14036 Console 1 140,168 K\r\nLdsLite.exe 14016 Console 1 8,220 K\r\nComputerZService.exe 10428 Console 1 3,196 K\r\nQQLiveService.exe 10012 Console 1 5,844 K\r\nsvchost.exe 9068 Services 0 336 K\r\nChsIME.exe 8808 Console 1 424 K\r\nPopWndLog.exe 10080 Console 1 572 K\r\nApplicationFrameHost.exe 9220 Console 1 868 K\r\nsvchost.exe 7488 Services 0 468 K\r\nrundll32.exe 10704 Console 1 268 K\r\nQQLive.exe 2300 Console 1 3,032 K\r\nMicrosoftEdge.exe 7580 Console
1 #subprocess模块 2 import subprocess,time 3 obj=subprocess.Popen( 4 'tasklistaaa', 5 shell=True, 6 stdout=subprocess.PIPE, 7 stderr=subprocess.PIPE 8 ) 9 print(obj.stdout.read()) 10 print(obj.stderr.read().decode('gbk'))
输出:
b''
'tasklistaaa' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
1 sys模块 2 1 sys.argv 命令行参数List,第一个元素是程序本身路径 3 2 sys.exit(n) 退出程序,正常退出时exit(0) 4 3 sys.version 获取Python解释程序的版本信息 5 4 sys.maxint 最大的Int值 6 5 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 7 6 sys.platform 返回操作系统平台名称
1 #=========知识储备========== 2 #进度条的效果 3 [# ] 4 [## ] 5 [### ] 6 [#### ] 7 8 #指定宽度 9 print('[%-15s]' %'#') 10 print('[%-15s]' %'##') 11 print('[%-15s]' %'###') 12 print('[%-15s]' %'####') 13 14 #打印% 15 print('%s%%' %(100)) #第二个%号代表取消第一个%的特殊意义 16 17 #可传参来控制宽度 18 print('[%%-%ds]' %50) #[%-50s] 19 print(('[%%-%ds]' %50) %'#') 20 print(('[%%-%ds]' %50) %'##') 21 print(('[%%-%ds]' %50) %'###') 22 23 24 #=========实现打印进度条函数========== 25 import sys 26 import time 27 28 def progress(percent,width=50): 29 if percent >= 1: 30 percent=1 31 show_str=('[%%-%ds]' %width) %(int(width*percent)*'#') 32 print('\r%s %d%%' %(show_str,int(100*percent)),file=sys.stdout,flush=True,end='') 33 34 35 #=========应用========== 36 data_size=1025 37 recv_size=0 38 while recv_size < data_size: 39 time.sleep(0.1) #模拟数据的传输延迟 40 recv_size+=1024 #每次收1024 41 42 percent=recv_size/data_size #接收的比例 43 progress(percent,width=70) #进度条的宽度70 44 45 #打印进度条
1 shutil模块 2 高级的 文件、文件夹、压缩包 处理模块 3 shutil.copyfileobj(fsrc, fdst[, length]) 4 将文件内容拷贝到另一个文件中 5 1 import shutil 6 2 shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w')) 7 shutil.copyfile(src, dst) 8 拷贝文件 9 1 shutil.copyfile('f1.log', 'f2.log') #目标文件无需存在 10 11 shutil.copymode(src, dst) 12 仅拷贝权限。内容、组、用户均不变 13 1 shutil.copymode('f1.log', 'f2.log') #目标文件必须存在 14 15 shutil.copystat(src, dst) 16 仅拷贝状态的信息,包括:mode bits, atime, mtime, flags 17 1 shutil.copystat('f1.log', 'f2.log') #目标文件必须存在 18 19 shutil.copy(src, dst) 20 拷贝文件和权限 21 1 import shutil 22 2 shutil.copy('f1.log', 'f2.log') 23 24 shutil.copy2(src, dst) 25 拷贝文件和状态信息 26 1 import shutil 27 2 shutil.copy2('f1.log', 'f2.log') 28 29 shutil.ignore_patterns(*patterns) 30 shutil.copytree(src, dst, symlinks=False, ignore=None) 31 递归的去拷贝文件夹
1 #shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细: 2 import zipfile 3 4 # 压缩 5 z = zipfile.ZipFile('laxi.zip', 'w') 6 z.write('a.log') 7 z.write('data.data') 8 z.close() 9 10 # 解压 11 z = zipfile.ZipFile('laxi.zip', 'r') 12 z.extractall(path='.') 13 z.close() 14 15 zipfile压缩解压缩
1 import tarfile 2 3 # 压缩 4 >>> t=tarfile.open('/tmp/egon.tar','w') 5 >>> t.add('/test1/a.py',arcname='a.bak') 6 >>> t.add('/test1/b.py',arcname='b.bak') 7 >>> t.close() 8 9 10 # 解压 11 >>> t=tarfile.open('/tmp/egon.tar','r') 12 >>> t.extractall('/egon') 13 >>> t.close() 14 15 tarfile压缩解压缩