day09_正课总结

文件处理

什么是文件处理

修改存储的信息

什么是文件

操作系统提供的虚拟概念,存储信息(二进制)

操作文件的流程

1.打开文件

语法格式: open ('文件路径','打开模式',encoding='编码格式')

fw = open (r'相对/绝对路径','r',encoding='utf8')

注意点

  1. r会让内部所有的\失效;或者也可以在邪光前再加一个斜杠使第二个斜杠失效
  2. 建议更多使用相对路径

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

  1. fw = open ('毛主席诗文.txt,'wt') #清空是只要使用'wt'模式就会做,而不管是否使用.write写入

  2. 仅做了解

    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')           

猜你喜欢

转载自www.cnblogs.com/-406454833/p/11552244.html