文件操作
文件操作
什么是文件?
文件其实是操作系统暴露给用户操作硬盘的快捷方式(接口)
代码如何操作文件
open()
打开文件
三步走:
1.利用关键字open打开文件
2.利用其它方法操作文件
3.关闭文件
文件路径
1.相对路径
相对于当前文件所在的对应的位置 (随着参照文件位置的改变相对位置一定改变)
2.绝对路径
文件的ip地址 (即文件在硬盘中存储的位置,不管查找的对象是谁都可以在硬盘相应位置找到)
eg:D:\py20\day08\a.txt
3.路径中的特殊含义取消
路径中出现了字母与斜杠的组合产生了特殊含义如何取消
在路径字符串前面加一个r
r'D:\py20\day08\a.txt'
open('a.txt') open(r'D:\py20\day08\a.txt') res = open('a.txt', 'r', encoding='utf8') print(res.read()) res.close() # 关闭文件释放资源 """ open(文件路径,读写模式,字符编码) 文件路径与读写模式是必须的 字符编码是可选的(有些模式需要编码) """ # with上下文管理(能够自动帮你close()) with open(r'a.txt','r',encoding='utf8') as f1: # f1=open() f1.close() print(f1.read()) """以后代码操作文件 推荐使用with语法"""
"""
补全语法结构 没有实际含义
pass
...
"""
r 只读模式(只能看不能改)
# 路径不存在:直接报错 with open(r'b.txt', 'r', encoding='utf8') as f: pass # 路径存在 with open(r'a.txt', 'r', encoding='utf8') as f: print(f.read()) # 读取文件内所有的内容 f.write('123') # 写文件内容
w 只写模式(只能写不能看)
# 路径不存在:路径不存在自动创建 with open(r'b.txt', 'w', encoding='utf8') as f: pass # 路径存在:1.会先清空文件内容 2.再执行写入操作 with open(r'a.txt', 'w', encoding='utf8') as f: f.read() f.write('hello world!\n') f.write('hello world!\n') f.write('hello world!\n')
a 只追加模式(追加内容)
# 路径不存在:路径不存在自动创建 with open(r'b.txt', 'a', encoding='utf8') as f: f.read() # 报错 提示没有阅读权限 f.write('嗯嗯嗯') # 路径存在:1.不会清空文件内容 2.不可以看里面的文件 3.可以执行写入操作 with open(r'a.txt', 'a', encoding='utf8') as f: f.read() # 报错 提示没有阅读权限 f.write('嗯嗯嗯')
"""
小总结
我们所学习的r w a读写模式都只能操作文本文件
"""
1.读系列.read()
with open(r'a.txt', 'r', encoding='utf8') as f: print(f.read()) # 一次性读取文件内所有的内容 print(f.readline()) # 每次只读文件一行内容 print(f.readlines()) # 读取文件所有的内容 组织成列表 每个元素是文件的每行内容 print(f.readable()) # 判断当前文件是否具备读的能力
2.写系列.write()
with open(r'a.txt','w',encoding='utf8') as f: f.write('克服一切困难 奥利给!') # 往文件内写入文本内容 f.write(123) # 写入的内容必须是字符串类型 f.writelines(['jason','kevin','tony']) # 可以将列表中多个字符串元素全部写入 print(f.writable()) # True print(f.readable()) # False f.flush() # 直接将内存内文件数据刷到硬盘 相当于ctrl+s
with open(r'a.txt', 'r', encoding='utf8') as f: print(f.read()) # 一次性读取文件内所有的内容 print(f.read()) # 一次性读取文件内所有的内容 print(f.read()) # 一次性读取文件内所有的内容 """ 1.一次性读完之后 光标停留在了文件末尾 无法再次读取内容 2.该方法在读取大文件的时候 可能会造成内存溢出的情况 解决上述问题的策略就是逐行读取文件内容 """ for line in f: # 文件变量名f支持for循环 相当于一行行读取文件内容 line ''' 以后涉及到多行文件内容的情况一般都是采用for循环读取 '''
with open(r'a.txt','rb') as f: print(f.read()) print(f.read(6).decode('utf8')) with open(r'a.txt','r',encoding='utf8') as f: print(f.read()) print(f.read(4)) """ read() 括号内可以放数字 在t模式下表示字符个数 在b模式下表示字节个数 英文字符统一使用一个bytes来表示 中文字符统一使用三个bytes来表示 """
.seek()
.seek(offset,whence)
offset表示位移量
始终是以字节为最小单位
正数从左往右移动
负数从右往左移动
whence表示模式
0:以文件开头为参考系(支持tb两种模式)
1:只支持b模式 以当前位置为参考系
2:只支持b模式 以文件末尾为参考系
with open(r'b.txt', 'rb') as f: print(f.read(4).decode('utf8')) print(f.tell()) # 查看光标移动了多少个字节 f.seek(3, 1) print(f.read().decode('utf8')) """ 控制文件内光标的移动 f.seek() f.seek(offset,whence) offset表示位移量 始终是以字节为最小单位 正数从左往右移动 负数从右往左移动 whence表示模式 0:以文件开头为参考系(支持tb两种模式) 1:只支持b模式 以当前位置为参考系 2:只支持b模式 以文件末尾为参考系 """
小练习:实现动态查看最新一条日志的效果
import time with open('a.txt', 'rb') as f: f.seek(0, 2) # 将光标移动到文件末尾 while True: line = f.readline() if len(line) == 0: # 没有内容 time.sleep(0.5) else: print(line.decode('utf-8'), end='')
方式1 覆盖
# 方式1 覆盖 with open(r'c.txt','r',encoding='utf8') as f: data = f.read() print(type(data)) with open(r'c.txt','w',encoding='utf8') as f1: new_data = data.replace('tony','jason') f1.write(new_data)
方式2 新建
# 方式2 新建 import os with open('c.txt', mode='rt', encoding='utf-8') as read_f, \ open('c.txt.swap', mode='wt', encoding='utf-8') as write_f: for line in read_f: write_f.write(line.replace('SB', 'kevin')) os.remove('c.txt') # 删除原文件 os.rename('c.txt.swap', 'c.txt') # 重命名文件 """ 自己总结两种方式的优缺点 """
END