文件处理
什么是文件处理
修改存储的信息
什么是文件
操作系统提供的虚拟概念,存储信息(二进制)
操作文件的流程
1.打开文件
语法格式: open ('文件路径','打开模式',encoding='编码格式')
fw = open (r'相对/绝对路径','r',encoding='utf8')
注意点
- r会让内部所有的\失效;或者也可以在邪光前再加一个斜杠使第二个斜杠失效
- 建议更多使用相对路径
2.修改/读取文件
fr.write('''
孩儿立志出乡关,学不成名誓不还
埋骨何须桑梓地,人生无处不青山
,,,)
3.保存文件
fw.flush()
#快速保存,类似于ctrl + s
4.关闭文件
del fw
python通过操作系统操作文件,删除fw,只是删除变量fw所指向的文件对象的内存占用
fw.close
#告诉操作系统关闭文件
文件的三种打开模式
以文本数据模式打开文件的三种方式
只读不可写:rt read_text
#fr.read() #读取所有文本内容
fr = open ('mzd
诗文.txt','rt',encoding='utf8')
#fr.write('asdfasdf') #报错不可写
data = fr.read() #读取所有文本内容
print(data)
print(fr.readable()) #判断是否可读
#以下仅做了解
print(fr.readline()) #读取一行,默认换行
print(fr.readlines()) #读取所有行放入列表
#要循环读出文本内容
for i in fr.read(): #循环读出一个个字符,文本中有换行符,print自带换行符,故部分字符换两行
print(i)
for i in fr:
print(i) #循环读出一行行字符,换行原理同上,节省内存
对同一个文件对象读取,光标会不断往后移不会刷新,要重新读,可以重新打开
文本读一行少一行,每一行末尾默认有一个换行
清空写入不可读:wt
fw = open ('毛主席诗文.txt,'wt')
#清空是只要使用'wt'模式就会做,而不管是否使用.write写入仅做了解
fw.writelines(['蔡','启','龙','宇宙','超级','无敌','帅'])
#参数为列表是,将列表元素拼接成一行写入
追加写入,不可读:at
encode编码 decode解码
乱码不可恢复,写文件encoding指定的是写入字符的编码格式,读文件encoding指定的是读取文件的解码格式
以二进制数据模式打开文件
b-->二进制模式,不单独使用一般与r/w/a联用,且以二进制模式打开不需要指定编码格式
一般不使用wb/ab模式,因为不了解数据与二进制的具体映射关系
一般只使用'rb'保存图片/音频/视频文件
fr2 = open ('计算机组成补充.mp4','rb')
print(fr2.read())
w和a模式写入文件时,如果文件不存在则自动创建
绝对路径和相对路径
相对路径
执行文件(当前运行的文件)和打开文件属于同一文件夹下
未来写项目尽量用相对路径,因为代码放入不同操作系统(windows-->linux)绝对路径会发生变化)
with管理上下文
语法
with提供一个自动关闭文件的功能(解除操作系统的占用)
'''
with open ('文件路径','打开模式',,encoding='编码格式') as fr3:
data = fr3.read() #在缩进内不会关闭文件
code2 #跳出缩进关闭文件
print(fr3) #只涉及python中的变量,变量指向的文件对象依然存在,不报错
print(fr3.read) #涉及操作系统中文件占用,已经关闭,报错
print(data) #data放入到python内存且存储了打开文件的数据,打印不报错
'''
文件的高级应用
全部仅做了解
打开文件的三种新模式(可读可写,尽量不使用)
可读可写无法保证读写同步
假设一个文件既可读又可写,假设写需要10s,读需要5s
针对一个文件内有一个'中'字,需要在'中'字后面写入一个'国'字,需要10s
过了1s,我们读了这个文件,又5s过后,我们看到文件只有一个'中'字
感觉自己没写入,你会再次写入一个'国'字(基于前面一个字是'中'字)
又4s过后,第一个的写入成功了,文件变成'中国'了
又6s过后,第二次写入一定失败
以前发生过,现在的电脑牛逼了,所以这种情况很少发生,但还是有一定概率
可读可覆盖写:"r+t"/"r+b"
光标在文件头部,覆盖写入
可清空写可读:"w+t"/"w+b"
等价于"w",使用"w+t"时即清空,先读再写读取内容一定为空
先写再读毫无意义
可追加写可读:"a+t"/"a+b"
with open ('毛主席诗文.txt','a+t',encoding='utf8') as fr4:
fr4.write('asdfg')
print(fr4.read()) #无法读取内容,写入后光标默认在尾部
综上:如果真的既有读的需求又有写的需求,用两种不同的模式打开两次文件
光标的高级应用(移动光标)
字节与字符
8个二进制位为一个字节,中文3个字节为1个字符,英文一个字节为1个字符
00000000 一个字节
00000000 00000000 00000000 一个中文字符
下一种移动光标以字符文单位
read
with open('mzd诗文.txt','rt',encoding='utf-8') as fr:
print(fr.read(3)) #n表示n个字符,不加默认读取所有,一个中文和一个英文都属于分别属于一个字符
下三种移动光标以字节为单位,因此必须==用'rb'模式打开==
seek
0/1/2/默认 四种参数
with open('mzd诗文.txt','rb') as fr:
#fr.seek(setoff,whence) setoff为光标偏移量,whence为光标开始位置
fr.seek(3,0) #'0'表示光标从头部开始,'3'表示偏移量为3,read默认从光标往后读取所有字节
print(fr.read().decode('utf8'))
#'rb'模式下读取的是二进制数据,此时read内参数读取的是以字节为单位,需解码才能显示成字符
fr.seek(3,1)
print(fr.read().decode('utf8'))
#'1'表示光标从当前位置开始,如果中文字节读取发生断码会报错
fr.seek(-8,2)
print(fr.read().decode('utf8'))
#'2'表示光标从尾部开始,'-8'表示光标向左偏移8个字节
fr.seek(6)
print(fr.read().decode('utf8'))
#seek内只有一个参数时表示的是setoff光标偏移距离,光标开始位置默认值为whence:int=0
tell
输出光标当前所在字节位置,以左端为0界基准
print(fr.tell())
truncate:截断
fr.truncate(3)
#截断就要作修改,必须用"ab"模式打开文件,以字节为单位,"3"表示光标从头部向右移动三个字节,从此处截断,后面字节舍去,切记不能使用"wb"模式,因为会使文件情况,截断就变得没有任何意义
文件的修改
文件没有修改一说,只有覆盖
with open ('毛主席诗文.txt','r+',encoding='utf8') as fr:
data = fr.read()
print(data)
fr.seek(3,0)
fr.write('干')
#可追加写可读模式:“a+t“光标固定在尾部字节,不可调控
缓存文件原理
with open ('毛主席诗文.txt','r',encoding='utf8') as fr,open ('swap.txt','w',encoding='utf8') as fw:
data = fr.read()
data = data.replace('中国','全世界')
fw.write(data)
import os
os.remove('毛主席诗文.txt')
os.rename('swap.txt','毛主席诗文.txt')
with open ('毛主席诗文.txt','r',encoding='utf8') as fr,open ('swap.txt','w',encoding='utf8') as fw:
#改进:一行一行读取修改,再大文件都能修改
for i in fr:
i = i.replace('中国','全世界')
fw.write(i)
import os
os.remove('毛主席诗文.txt')
os.rename('swap.txt','毛主席诗文.txt')