13 文件
第14节 文件解答课内容补充1,Linux命令2,描述符3,作业解答一,文件基本操作1,打开文件2,写入文件3,读取与关闭4,查看5,小结二,上下文管理1,自动关闭文件 (with的用法)三,IO流引入1,StringIO2,BytesIO3,OS 操作系统交互4,shutil 高级文件操作
解答课内容补充
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文件(慎用!) |
假设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