Python——多个装饰器、文件的操作以及os模块

一、装饰器

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))

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值