• 13 文件


    第14节 文件


    解答课内容补充

    1,Linux命令
    Linux命令作用示例(不对应首列命令)作用
    find 查找 格式:find [-path] -options  
    path 要查找的目录,默认当前目录    
    option:      
    -name 按文件名的某种规则查找 find ./ -name '*.py' -print 查找当前目录下所有后缀为py的文件
    -type 按文件类型查找 f普通文件 l符号连接 d目录 find ./ ! -name '*.py' 查找当前目录下所有后缀不为py的文件
    -size 按文件大小查找 find -size +6k 查找大于6k的文件,不写的时候就是等于
    -exec<执行指令> 假设find的回传值为True就执行该指令 find ./ -name '*.py' -exec rm -rf {} ; 删除当前目录下所有py文件(慎用!)
    -print 假设find的回传值为True,就将文件或目录名称列出到标准输出    
    2,描述符

    这类里面实例化另一个类,对这个示例做访问时,可用__get__ __set__ __delete__方法

    描述符协议:python描述符是一个“绑定行为”的对象属性,在描述符协议中,它可以通过方法重写属性的访问。这些方法有get(), set(), 和delete()。如果这些方法中的任何一个被定义在一个对象中,这个对象就是一个描述符

    class MyClass(object):
        def __get__(self, instance, owner):
            return '超哥666'def __set__(self, instance, value):
            print('this is %s' % value)
    ​
        def __delete__(self, instance):
            print('南北666')
    ​
    ​
    class Control(object):
        attr = MyClass()  # attr是一个实例
    ​
    ​
    c = Control()
    print(c.attr)  #使用c.attr的时候会调用MyClass类的__get__方法
    c.attr = 10
    del c.attr
    ​
    # 运行结果
    超哥666
    this is 10
    南北666
    3,作业解答
    • 思路

    # 测试type和isinstance两个函数,哪个速度更快
    # 思路:
     1,定义两个函数
     2,加功能(定义run_time函数参数传入func,闭包函数count(为加装饰器),写好装饰器的框架return内层 return count外层)
     3,导入datetime模块
     4,统计开始时间,调用函数func并用temp接收,内层return出temp,再统计结束时间
     5,print出运行时间
     6,加上函数本身装饰器(注:函数装饰器不能加到类上)
    • 过程

    from datetime import datetime
    ​
    def run_time(func):
        def count(*args):
            start_time = datetime.now()
            temp = func(*args) 
            end_time = datetime.now() 
            print('程序的运行时间是:%s' % (end_time - start_time))
            return temp
        return count  #装饰器要装饰到别的函数上不能直接调用
    ​
    ​
    @run_time   # 装饰器的实质把一个函数换成另一个函数
    def func1(a):
        print(type(a))
    ​
    ​
    @run_time
    def func2(a, b):
        print(isinstance(a, b))
    ​
    func1(1)
    func2('hello', int)
    ​
    # 运行结果
    <class 'int'>
    程序的运行时间是:0:00:00.001849
    False
    程序的运行时间是:0:00:00.001265

    一,文件基本操作

    1,打开文件
    path = 'test.txt'                      # 文件与当前py文件处于同一目录
    path = r'/home/pyvip/py_case/text.txt'   # 文件与当前py文件处于同一目录(从其他文件夹下访问其他文件要从根目录下写)
    ​
    file = open(path, 'r')                  # 打开文件 参数r为读取
    file.read()                            # 读取文件返回值为文件内容
    2,写入文件
    file.open('test.txt','w')               # 打开文件 参数w为可写,但写完会覆盖原有内容
    file.write('今天天气不错')                # 写入
    file.close()                            # 关闭文件,此时文件内容为:今天天气不错
    
    file.open('test.txt','a')               # 打开文件 参数a为在文件后添加内容
    file.write('今天天气不错2')               # 写入
    file.writelines(['1','2','3'])           # 写入,可传入[]拼接到一起 类似join 
    file.flush()                            # 保存文件
    3,读取与关闭
    file.read()        # 读取全部内容
    file.readline()    # 读取一行
    file.readlines()   # 一行保存为一个元素,组成一个列表 
    file.close()
    ​
    # 注文件open()后,必须close()
    4,查看
    file=open('test.txt','r')
    file.tell()       # 返回此时光标的位置(查看指针)
    file.readline()   # 读取一行
    file.seek(0)      # 将文件光标移动到起始位置
    file.seek(70)     # 将文件光标移动到70的位置,
    5,小结
    模式描述
    r 以只读方式打开文件,文件指针默认放在文件开头
    rb 以二进制格式打开一个文件用于只读,文件指针默认放在文件开头,一般用于非文本文件(如图片等)
    r+ 以二进制格式打开一个文件用于读写,文件指针默认放在文件开头
    rb+ 打开一个文件用于读写,文件指针默认放在文件开头,一般用于非文本文件(如图片等)
    w 打开一个文件只用于写入,如果该文件已存在则将其覆盖,如果不存在,创建新文件
    wb 以二进制格式打开一个文件用于只读,如果该文件已存在则将其覆盖,如果不存在,创建新文件,一般用于非文本文件(如图片等)
    w+ 打开一个文件用于读写,如果该文件已存在则将其覆盖,如果不存在,创建新文件
    wb+ 以二进制格式打开一个文件用于读写,如果该文件已存在则将其覆盖,如果不存在,创建新文件,一般用于非文本文件(如图片等)
    a 打开一个文件用于追加,如果文件已存在,文件指针会放在文件结尾(也就是说,新的内容将会被写到已有内容之后)如果不存在,创建新文件进行写入
    ab 以二进制格式打开一个文件用于追加,如果文件已存在,文件指针会放在文件结尾(也就是说,新的内容将会被写到已有内容之后)如果不存在,创建新文件进行写入
    a+ 打开一个文件用于读写,如果文件已存在,文件指针会放在文件结尾,文件打开时会是追加模式,如果不存在,创建新文件用于读写
    ab+ 以二进制格式打开一个文件用于追加,如果文件已存在,文件指针会放在文件结尾,如果不存在,创建新文件用于读写

    二,上下文管理

    1,自动关闭文件 (with的用法)
    • openxls

    with open('test.txt','r') as file:
        print(file.read())
    # 例:

    from datetime import datetime
    class RunTime(object):
        def __enter__(self):
            self.start_time = datetime.now()
            print(self.start_time)
            return self.start_time
    ​
        def __exit__(self, exc_type, exc_val, exc_tb):
            self.end_time = datetime.now()
            print(self.end_time)
            print('运行时间为: %s' % (self.end_time - self.start_time))
    ​
    ​
    run = RunTime()
    with run as a:
        for i in range(200):
            type('hello')
            
    # 运行结果:
    2018-04-18 01:47:34.042769
    2018-04-18 01:47:34.043882
    运行时间为: 0:00:00.001113
            
    # 通过这两个方法可以方便的实现上下文管理
    with 会把 __enter__的返回值赋值给as后的变量
    以后敲代码用with,避免直接使用open()
    
    

    三,IO流

    引入

    文件可以持久存储,但是现在类似于临时的一些文件,不需要持久存储,如一些临时的二维码,这个不需要持久存储,但是却需要短时间内大量读取,这时候还是只能保存在文件里吗?

    1,StringIO

    StringIO 在内存中如同打开文件一样操作字符串,因此也有文件的很多方法,当创建StringIO调用close()方法是,在内存中的数据会被丢失

    • 创建IO操作

    import io
    myio = io.StringIO()
    myio.write('今天天气不好')
    myio.getvalue()    # 读取
    # 此操作在内存中,未在硬盘里
    • 写入

    >>> import io
    >>> myio = io.StringIO()
    >>> myio.write('亲,在干嘛')
    5
    >>> myio.read()
    ''
    >>> myio.seek(0)
    0
    >>> myio.read()
    '亲,在干嘛'
    >>> myio.getvalue()
    '亲,在干嘛'
    >>> myio.close()
    2,BytesIO
    • 操作二进制(一般用于处理图片)

    import io
    my_byte_io = io.BytesIO()
    my_byte_io.write(b'hello')
    print(my_byte_io.getvalue())
    3,OS 操作系统交互

    os 模块提供python和操作系统交互的接口

    • 直接调用系统命令

    import os
    os.system('ls')
    os.system('cat test.txt')
    • 通用路径的操作

    import os
    os.path
    os.path.join('pyvip','hch','hello') # 拼接路径
    os.mkdir('py_case2')
    os.rename('py_case2','py_case_del') # 重命名
    4,shutil 高级文件操作
    • 移动文件

    import shutil
    shutil.move('test.txt','tanzhou')# 将文件test.txt移动到tanzhou文件夹内
    • 复制文件shutil.copytree

    • 删除文件shutil.rmtree

  • 相关阅读:
    timer.Interval用法简介
    .net 未被引用的错误
    将Sql查询语句获取的数据插入到List列表里面
    .net 里面打不出来ConfigurationManager
    .net MVC框架里怎么写控件
    数据库里面几个字符类型的区别
    怎么在.net里面解析JSON文件?
    SqlCommand.ExecuteScalar()方法
    git学习笔记
    可变参数的lambda表达式
  • 原文地址:https://www.cnblogs.com/zcmq/p/9114136.html
Copyright © 2020-2023  润新知