一、装饰器
1.functools.wraps ( ) 装饰器的使用
(1).functools.wraps的特点:
a.对一个函数添加多个装饰器时,被装饰函数不受装饰器的影响
b.装饰器的名字变成被装饰名字,外部调用到的是被装饰函数的功能
"""
例子:求函数的运行时间和函数的返回值
"""
import time
import functools ##调用 functools.wraps() 装饰器所需要的模块
def log_kind(kind):
def add_log(fun):
@functools.wraps(fun)
def wrapper(*args,**kwargs):
start_time = time.time()
res = fun(*args,**kwargs)
end_time = time.time()
print('<%s>[%s] 函数名: %s, 运行时间: %.6f, 运行返回值结果: %d'
%(kind,time.ctime(),fun.__name__,end_time - start_time,res))
return res
return wrapper
return add_log
@log_kind('debug')
def add(x,y):
time.sleep(1)
return x + y
add(1,2)
2.多个装饰器的使用
"""
一个函数同时使用多个装饰器时,按照装饰器添加在函数前的书写顺序来决定执行顺序
"""
def decorator_a(fun):
def inner_a(*args,**kwargs):
print('Get in inner_a')
return fun(*args,**kwargs)
return inner_a
def decorator_b(fun):
def inner_b(*args,**kwargs):
print('Get in inner_b')
return fun(*args,**kwargs)
return inner_b
@decorator_b
@decorator_a
def f(x):
print('Get in f')
return x*2
f(1)
二、文件的操作
1.文件
#注意:一般在对文件进行操作后要关闭文件,因为打开的文件不关闭会占用内存,且linux打开文件的总个数是可以查看的。
#而且在对文件进行读写等操作时,要用户本身对这个文件有操作权限。
"""
打开文件的步骤:打开 --> 操作 --> 关闭
r:(默认)
-只能读,不能写
-读取的文件不存在,会报错
r+:
-可读写
-文件不存在,报错
-默认从文件指针所在位置开始写入
"""
f = open('/home/kiosk/passwd','r+')
f.write('python')
print(f.tell()) ##显示写入'python'后的指针位置
content = f.read()
print(content) ##会从指针处开始读文件,所以写入的python是看不到的
f.close()
"""
打开文件的步骤:打开 --> 操作 --> 关闭
w:
-只能写
-会清空文件之前的内容
-文件不存在,不会报错,会创建新的文件并写入
w+:
-可读写
-会清空文件内容
-文件不存在,不会报错,会创建新的文件并写入
"""
f = open('/home/kiosk/passwd','w+')
f.write('python')
print(f.tell())
content = f.read()
print(content) ##写入内容时会清空原来的内容,所以在指针在python后没有内容显示
f.close()
"""
a:
-只能写
-文件不存在,不报错
-不会清空文件内容
a+:
-可读写
-文件不存在,不报错
-不会清空文件内容
"""
f = open('/home/kiosk/passwd','a+')
print(f.tell())
content = f.read()
print(content)
f.write('redhat123')
print(f.tell()) ##通过观察指针的位置查看写入位置
print(f.readable()) ##显示文件是否可读,返回布尔值
print(f.writable()) ##显示文件是否可写,返回布尔值
f.close()
2.文件的读取操作
"""
readlines():读取文件内容,返回一个列表,列表里的元素分别为文件每行的内容
"""
f = open('/home/kiosk/passwd','r+')
# print(f.read())
print(f.readline())
print(f.tell()) ##从指针开始处读取这一行的内容
print(f.readlines()) ##从指针开始处读取文件所有内容并以行的格式返回一个列表
f.close()
"""
readlines():读取文件内容,返回一个列表,列表里的元素分别为文件
每行的内容
"""
f = open('/home/kiosk/passwd','r+')
# print(f.read())
# print(f.readline())
# print(f.tell())
# print(f.readlines())
print(f.read(4)) ##读指针开始处4位
print(f.readline(),end='')
#print([line.strip() for line in f.readlines()])
print(list(map(lambda x:x.strip(),f.readlines()))) ##以遍历或者匿名函数的方法返回一个以每行为元素的列表
f.close()
"""
seek方法,移动指针
seek第一个参数是偏移量:>0,代表向右移动,<0,代表向左移动
seek第二个参数是:
0:移动指针到文件开头
1:不移动指针
2:移动指针到末尾
"""
f = open('/home/kiosk/passwd','r+')
print(f.tell())
print(f.write('redhat'))
print(f.tell())
print(f.read())
f.seek(0,0) ##将指针移动到最开始的位置
print(f.tell())
print(f.read())
f.close()
3.非纯文本文件读取
"""
读取文本文件:
r r+ w w+ a a+
读取二进制文件
rb rb+ wb wb+ ab ab+
"""
#读取二进制文件内容
f = open('redhat.jpg',mode='rb')
content = f.read()
f.close()
f1 = open('hello.jpg',mode='wb')
f1.write(content) ##将f的内容写入f1,图片的内容不变
f1.close()
4.上下文管理器
"""
文件的整体操作
"""
# f = open('/home/kiosk/passwd')
# with open('/home/kiosk/passwd') as f:
# print(f.read()) 读取passwd所有内容
with open('/home/kiosk/passwd') as f1,\
open('/home/kiosk/passwd1','w+') as f2: ##只有python3才可以这么写,python2需要用with分别来书写多个条件
f2.write(f1.read()) ##把f2里的所有内容写入f1
f2.seek(0,0)
print(f2.read())
三、os模块
1.os模块的简单使用
import os
#1.返回操作系统类型
#posix:表示linux操作系统,nt,表示windows操作系统
print(os.name)
#2.操作系统详细信息,包括操作系统类型、主机名、内核版本、系统时间、操作系统多少位
info = os.uname()
print(info)
print(info.sysname) ##可通过想得到的名称来直接获得信息
print(info.nodename)
import os
#3.环境变量,os.environ是一个字典,一系列的键、值对存储在该字典中,系统环境信息全部存储在该字典中
print(os.environ)
#4.从环境变量字典中获取相应的信息
# os.environ['HOMEPATH'] # 当前用户主目录
# os.environ['TEMP'] # 临时目录路径
# os.environ['PATHEXT'] # 可执行文件
# os.environ['SYSTEMROOT'] # 系统主目录
# os.environ['LOGONSERVER'] # 机器名
# os.environ['PROMPT'] # 设置提示符
# os.environ['PATH'] # 系统环境信息
print(os.environ.get('PATH'))
2.os模块的拓展用法
import os
#1.只判断是否为绝对路径,即使文件或目录不存在时也不会报错
print(os.path.isabs('/tmp/hello/westos'))
print(os.path.isabs('hello'))
#2.生成绝对路径
print(os.path.abspath('hello.png'))
print(os.path.join('/home/kiosk','hello.png'))
print(os.path.join(os.path.abspath('.'),'hello.png'))
import os
#3.获取目录名或者文件名
filename = '/home/kiosk/PycharmProjects/20190322/day05/hello.png'
# 获取路径中的文件名
print(os.path.basename(filename))
# 获取路径中的目录名
print(os.path.dirname(filename))
#4.创建目录/删除目录
#os.mkdir('img')
os.makedirs('img/file') #创建递归目录
os.rmdir('img') #目录不为空时会报错,无法删除该目录
import os
from os.path import exists,splitext,join
#5.创建文件/删除文件
os.mknod('a.txt')
# os.remove('a.txt')
#6.文件重命名,文件不存在时会报错
os.rename('a.txt','data.txt') ##前面为原文件名,后面为修改名
#7.判断文件或者目录是否存在,不存在即为False
print(os.path.exists('imgs'))
#8.分离后缀名和文件名
print(os.path.splitext('hello.jpg'))
#9.目录名和文件名分离
print(os.path.split('/home/kiosk/hello.jpg'))
3.os模块遍历指定目录的用法
import os
from os.path import join
for root,dir,files in os.walk('/var/log'):
# print(root) ##查看/var/log/下的所有属于root用户的目录,但是没有权限的目录无法显示出来
print(dir) ##查看可以访问的所有目录
# print(files) ##查看目录下的文件
for name in files: ##查看目录中的所有文件(有查看的权限)
print(join(root,name))