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 模块编写一个资源监控程序,并发送邮件

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()
View Code

 

迭代器

什么时迭代器?

  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)

 

posted @ 2019-04-29 18:46  怜寒  阅读(269)  评论(0编辑  收藏  举报