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

 

posted @ 2018-05-30 23:02  开心每一天q  阅读(143)  评论(0编辑  收藏  举报