文件处理
1.关键方法
open(文件路径,操作模式,字符编码) # 打开文件
close() # 关闭文件
"""
推荐编写路径的前面加字母r:斜杠跟字母的组合有时候会产生特殊含义 路径中不应该有这种现象
print('asda\n\a\tsadad')
print(r'asda\n\a\tsadad')
"""
2.推荐写法
"""
不推荐写法(原因是怕忘记close 量大了之后影响资源和效率)
变量名 = open()
变量名.close()
"""
with open() as 变量名:
子代码
ps:子代码运行结束自动调用close关闭资源(省事)
"""
pass关键字
仅仅是用来补全代码结构 防止报错 本身没有任何含义
"""
r 只读模式 只能读不能写
'''r模式 文件路径不存在会直接报错'''
with open(r'b.txt','r',encoding='utf8') as f:
pass
'''r模式 文件路径存在等待读取文件'''
with open(r'a.txt','r',encoding='utf8') as f:
pass
w 只写模式 只能写不能读
'''w模式 文件路径不存在自动创建该文件'''
with open(r'b.txt','w',encoding='utf8') as f:
pass
'''w模式 文件路径存在会先清空该文件内容 之后再写入'''
with open(r'a.txt','w',encoding='utf8') as f:
f.write('哈哈哈')
a 追加模式 尾部追加写不能读
'''a模式 文件路径不存在自动创建该文件'''
with open(r'a.txt','w',encoding='utf8') as f:
pass
'''a模式 文件路径存则在文件末尾等待写入'''
with open(r'a.txt','w',encoding='utf8') as f:
pass
ps:除了上述三种模式之外其实还有其他模式 只不过很少用 可以不看
1.read()
一次性读取文件中所有的内容
当文件特别大的时候 该方法不可取(内存溢出) 推荐使用for循环
########################################################
2.for循环文件内容(重要)
每次只读文件一行内容 肯定不会出现内存溢出的情况
########################################################
3.readline()
没执行一次只读一行内容
4.readlines()
一次性读取文件内容并按照行组织成列表中一个个数据值
5.readable()
判断文件是否可以执行读的操作
6.write()
朝文件中写数据
7.writable()
判断文件是否可执行写的操作
8.writelines()
括号内支持传列表
9.flush()
将内存中的文件数据立刻刷到硬盘(类似于主动按ctrl+s)
ps:文件内光标移动的概念
现象:执行完read操作之后 再次执行read不会有内容
t 文本模式
默认的操作模式
r >>>: rt
w >>>: wt
a >>>: at
1.该模式只能操作文本文件
2.读写都是以字符串为单位
3.尽量要指定encoding参数(如果不指定则会采用当前计算机默认编码)
b 二进制模式
rb\wb\ab
1.该模式可以操作任意类型文件
2.读写都是以bytes类型为单位
3.千万不要指定encoding参数(如果指定了会直接报错)
ps:在python中bytes类型等同于二进制数据
"""
机器硬盘存储数据的原理
写数据类似于刻字 该数据其实叫复杂
1.覆盖原来的数据重新刻
2.换个位置重新刻 原来的位置删掉
删数据:艳照门事件(当前人修电脑之前是删了的)
简单的删除数据相当于把硬盘某块空间状态改变了 数据其实还在
只有当写入新的数据时候才有可能被覆盖掉
ps:如何确保自己的硬盘数据不会被泄露 先格式化 然后找无效的数据下载满之后再删除 就算回复那也是无效的数据 徒劳无或
"""
张一蛋 山东 179 49 12344234523
李二蛋 河北 163 57 13913453521
王全蛋 山西 153 62 18651433422
with open(r'c.txt', 'r+', encoding='utf8') as f:
f.seek(9)
f.write('<妇女主任>')
# 强调:
# 1、硬盘空间是无法修改的,硬盘中数据的更新都是用新内容覆盖旧内容
# 2、内存中的数据是可以修改的
# 修改文件内容的方式1>>>:覆盖写
# with open(r'b.txt', 'r', encoding='utf8') as f:
# data = f.read()
# with open(r'b.txt', 'w', encoding='utf8') as f:
# f.write(data.replace('jason', 'tony'))
# 修改文件内容的方式2>>>:备份写
import os
with open('b.txt', 'r', encoding='utf-8') as read_f, open('b.txt.swap', 'w', encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line.replace('tony', 'jasonNB'))
os.remove(r'b.txt')
os.rename(r'b.txt.swap', r'b.txt')
1.文本模式下read括号内可以写数字意思是读取几个字符
f.read(8) jason说你好
2.二进制模式下read括号内可以写数字意思是读取几个字节
f.read(8) jason说
seek() 控制光标移动
第一个参数是位移量
字节数
第二个参数是模式
0:t和b都可以用
基于文件开头移动多少字节
1:只能用于b模式
基于光标当前位置移动字节
2:只能用于b模式
基于文件末尾移动多少字节
光标的移动其实也很少见 但是也有应用场景>>>:监控文件内容是否有新增