python文件处理、名称空间
应用程序是不能直接操作硬件的,应用程序需要通过OS操作硬件
f = open('C:\\Users\\86156\\Desktop\\test.txt','r',encoding='gbk') #用什么字符编码写的,就需要用什么字符编码读
操作文件的方法
掌握:
f.read() #读取所有内容,光标移动到文件末尾
f.readline() #读取一行内容,光标移动到第二行首部
f.readlines() #读取每一行内容,存放于列表中
f.write('1111\n222\n') #针对文本模式的写,需要自己写换行符
f.write('1111\n222\n'.encode('gbk')) #针对b模式的写,需要自己写换行符
f.writelines(['333\n','444\n']) #文件模式
了解:
f.readable() #文件是否可读
f.writable() #文件是否可读
f.closed #关闭文件
f.flush() #立刻将文件内容从内存刷到硬盘
f.name #查看打开的文件名
读方法r
8位1字节,1024bytes(字节)是1kb
f = open('C:/Users/86156/Desktop/test.txt','r',encoding='gbk')
data = f.read(4) #4是字符,不是字节
print(data)
f.close()
f =open('C:/Users/86156/Desktop/test.txt','r',encoding='gbk')
data = f.read() #读取光标右边所有字符
print(data)
f.close()
f = open('C:/Users/86156/Desktop/test.txt','r',encoding='gbk')
data = f.readline() #readline 按行读取
print(data)
f.close()
写方法w(覆盖)
f = open('C:/Users/86156/Desktop/test.txt','w',encoding='gbk')
f.write('啊啊啊,胜多负少') #覆盖原有内容
f.writelines(('a','d','s')) #把列表或者元组拼接成一行字符串写入文件中
f.close()
写方法a(不覆盖)
f.write('a a a a ')
f.writelines(['s','t'])
f.close()
bytes 类型操作文件
a = '你好'.encode('gbk') #转码
print(a.decode('gbk')) #解码
f = open('C:/Users/86156/Desktop/test.txt','rb')
print(f.read().decode('gbk'))
f.close()
with 方式打开,不用手动关闭文件
0模式可以用在bytes 类型和字符类型,1,2模式只能用在bytes 类型下
常用汉字在gbk中占3个字节,生僻字占的更多
with open('C:/Users/86156/Desktop/test.txt','rb') as f:
f.seek(0) #把光标移动到开头
data = f.read()
print(data)
f.read(1)
f.seek(1,1) #1代表相对位置
print(f.read().decode('gbk'))
tail -f /var/log/message | grep '404'
import time
with open(r'C:\Users\fengzi\Desktop\a.txt', 'r', encoding='utf-8') as f:
f.seek(0, 2)
while True:
data = f.readline()
if '404' in data:
print(data)
else:
time.sleep(0.05)
名称空间
py 文件名字不要跟导入的模块重名
py 文件可以当作模块导入
psutil 是一个资源监控模块
import psutil 内存 mem = psutil.virtual_memory() print(mem) cpu cpu = psutil.cpu_percent(1) print(cpu) 硬盘 disk = psutil.disk_usage(r'c:') print(disk)
变量名和内存地址对应的表叫做名称空间
内置名称空间:(python 启动时就有,python 自带的)python 解释器内置的名字,print ,max,min
全局名称空间:(执行python 文件时启动,包括 if 判断得出的结果)定义的变量
局部名称空间:(调用函数时启动,调用结束失效)函数内部定义的变量
总结:三者的加载顺序
内置----->全局------->局部
三者的访问顺序
局部------->全局------>内置
def f1():
def f2():
def f3():
print(max)
f3()
f2()
f1()
利用yagmail 模块编写一个资源监控程序,并发送邮件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import yagmail import psutil def sendmail(subject,contents): #连接邮箱服务器 yag = yagmail.SMTP(user='1850****602@163.com',password='X****3456',host='smtp.163.com') #发送邮件 yag.send(to='1850****602@163.com',subject=subject, contents=contents) #断开连接 yag.close() def cpu_info(): cpu = psutil.cpu_percent(1) return cpu def mem_info(): mem = psutil.virtual_memory() total_mem = int(mem[0]/1024/1024) free_mem = int(mem[1]/1024/1024) percent_mem = mem[2] used_mem = int(mem[3]/1024/1024) mem_dict = { 'total_mem':total_mem, 'free_mem':free_mem, 'percent_mem':percent_mem, 'used_mem':used_mem } return mem_dict def disk_info(): disk = psutil.disk_usage(r'c:') total_disk = int(disk[0]/1024/1024/1024) used_disk = int(disk[1]/1024/1024/1024) free_disk = int(disk[2]/1024/1024/1024) percent_disk = disk[3] disk_dict = { 'total_disk':total_disk, 'used_disk':used_disk, 'free_disk':free_disk, 'percent_disk':percent_disk } return disk_dict def main(): cpu = cpu_info() mem = mem_info() disk = disk_info() msg = ''' cpu利用率:%s%% 内存总大小:%sM 内存剩余大小:%sM 内存使用率:%s%% 内存使用大小:%sM 硬盘总大小:%sG 硬盘使用大小:%sG 硬盘剩余大小:%sG 硬盘使用率:%s%% ''' % (cpu,mem.get('total_mem'),mem.get('free_mem'),mem.get('percent_mem'),mem.get('used_mem'),disk.get('total_disk'),disk.get('used_disk'),disk.get('free_disk'),disk.get('percent_disk')) if cpu > 1: print('cpu过高') sendmail('cpu正在燃烧',msg) else: print('cpu正常') if __name__ == '__main__': main()
迭代器
什么时迭代器?
1.迭代器时一个重复的过程,即每一次重复为一次迭代
2.并且每次迭代的结果都是下一次迭代的初始值
l = [1,2,3] count=0 while count<len(l): #首先是重复动作,其次上一次的结果是下一次的初始值,因此,是迭代 print(l[count]) count+=1
为什么要有迭代器?什么时可迭代对象?什么时迭代器对象?
1.为何要有迭代器
对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖与索引的迭代方式,这就是迭代器
l1 = [1,2,3] t1 = (1,2,3) str1 = '123' num1 = 100 num2 = 100.1 s1 = {1,2,3} d1 = {'name':'aaa','age':'bbb'} f = open('mariadb.repo','r', encoding='utf-8') # count=0 # while count<len(f): #首先是重复动作,其次上一次的结果是下一次的初始值,因此,是迭代 # print(f[count]) # count+=1
2.为什么叫做可迭代对象? obj有 .__iter__方法的都叫做可迭代对象
l1 = [1,2,3]
t1 = (1,2,3)
str1 = '123'
num1 = 100
num2 = 100.1
s1 = {1,2,3}
d1 = {'name':'aaa','age':'bbb'}
l1.__iter__()
t1.__iter__()
str1.__iter__()
s1.__iter__()
d1.__iter__()
f.__iter__()
文件 列表 字符串 集合 元组叫做可迭代对象
3.什么叫做迭代器对象? obj 有.__iter__和 .__next__方法的叫做迭代器对象
f.__next__()
f.__iter__()
只有文件是迭代器对象
res1 = iter(l1) res2 = iter(t1) str3 = iter(str1) res4 = iter(s1) res5 = iter(d1)
iter 变为迭代器对象
for 的作用:
1.把可迭代对象变为迭代器对象
2.过滤错误信息
# for i in l1:#iter(l1) # print(i) # for i in num1: # print(i)
总结:迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象
装饰器
什么是装饰器?
在不改变源代码和调用方式的基础上给函数增加新的功能
def deco(func):#func = test def wrapper(): func() #test() print('this is test func') print('已经添加新功能') return wrapper def test(): print('this is test func') test = deco(test) #test = wrapper test() #wrapper()
生成器
什么是生成器?
只要函数里有yield 关键字,那么函数名()得到的结果就是生成器,生成器就是迭代器,并且不会执行函数内部代码
return 只能返回一个值,而 yield 可以返回多个值
生成器优点:
同一时间只储存一个值,节省空间
生成器缺点:
只能向后取值,不能向前取值
def test(): for i in range(100): yield i res = test() for k in res: print(k)