python-文件操作
1、文件的操作模式
1.1、控制文件的操作模式:
r(默认):制度
w:只写
a:追加
1.1.1、r模式
r只读模式:在文件不存在的时候报错,文件存在则文件内指针直接跳到文件开头
with open('路径+文件名',encoding='UTF-8') as f: data = f.read()
u1 = input('u:').strip() p1 = input('p:').strip() with open('a.txt', 'r', encoding='utf-8') as f: for line in f: u, p = line.strip('\n').split(':') if u1 == u and p1 == p: print('true') break else: print('false')
#输出结果
u:zf
p:123
true
1.1.2 、w模式
w只写模式:在文件不存在的时候会创建空文档,文件存在会清空文件,文件指针跑到文件开头
with open('a.txt', 'w', encoding='utf-8') as f: f.write('xxx\n') f.wirte('yyy')
强调:
1、在文件不关闭的情况下,连续写入,后写的内容一定跟在前写内容的后面
2、如果重新以w模式打开文件,则会清空文件内容
1.1.3、a模式
a:只追加写模式:在文本不存在时会创建空文档,文件存在会将文件指针直接移动到文件末尾
with open('a.txt', 'a', encoding='utf-8') as f: f.write('xxx')
a模式与w模式同异
1、相同:在打开不关闭情况下,连续的写入,新写的内容总会跟在前些的内容后面
2、不同:以a模式重新打开文件,不会清空源文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后
练习简单的注册功能:
u1 = input('u:').strip() p1 = input('p:').strip() with open('a.txt', 'at', encoding='utf-8') as f: info = f'{u1}:{p1}' f.write('\n') f.write(info)
1.1.4、+模式
r+ w+ a+:可读可写
平时一般不用可读可写模式
1.2、控制文件读写内容的模式
t、b模式均不能单独使用,必须与a/w/r之一结合使用
t(默认的):文本模式
1、读写文件都是以字符串为单位的
2、只能针对文本文件
3、如果是windows系统,则必须指定encoding参数为UTF-8,因为windows系统默认的编码是GBK
b:二进制模式
1、读写文件都是以bytes/二进制为单位的
2、可以针对所有文件
3、一定不能指定encoding参数
1.2.1、t模式
文件存取硬盘本质都是二进制的形式,当指定t模式时,内部帮我们做了编码和解码
1.2.3、t/b比较
1、在操作纯文本文件方面t模式帮我们省去了编码和解码的环节,b模式则需要手动编码与解码,所以此时t模式更为方便
2、针对非文本文件(如图片、视频、音频等)只能使用b模式
3、在b模式不能用encoding来指定编码
拷贝文件案例:
with open('a.txt', 'rt', encoding='utf-8') as f1, open('b.txt', 'wt', encoding='utf-8') as f2: for line in f1: f2.write(line)
2、文件操作的方法
2.1、重点
读写操作
1、f.read() # 读取所有内容,执行完该操作后,文件指针会移动到文件末尾
2、f.readline()# 读取一行内容,指针会移动到第二行首
4、f.readlines() # 读取每一行内容,存放与列表中
强调:
f.read()和f.readlines()都是将内容全部读取,如果内容过大会导致内存溢出,若还想将内容全读入内存,则必须分多次读入,有两种方式实现:
方式一:
with open('a.txt','rt',encoding='utf-8') as f: for line in f: print(line)
方式二:
with open('a.txt', 'rb') as f: while True: data = f.read(1024) if len(data) == 0: break print(data)
3、控制文件内指针移动
文件内指针移动都是以bytes为单位的,只有在t模式下的f.read(n),此时n的单位是字符,也就是多少字符的含义。
with open('a.txt', 'rt', encoding='utf-8') as f: print(f.read(3)) # 读取3个字符
with open('a.txt', 'rb') as f: print(f.read(3)) # 读取3个bytes
f.seek详细方法如下:
f.seek(指针移动的字节数,模式控制):
模式控制:
0:默认模式,该模式代表指针移动的字节数是以文件开头为参照的
1:该模式代表指针移动的字节是以当前所在的位置为参照的
2、该模式代表指针移动的字节是以文件末尾的位置为参照的
3.1、0模式的使用
with open('b.txt', 'rt', encoding='utf-8') as f: f.seek(3, 0) # 参照文件开头移动了3个字节 print(f.tell()) # 查看当前文件指针距离文件开头的位置 print(f.read()) # 从第3个字节的位置读到文件末尾,输出结果为:你好
注意:由于在t模式下,会将读取到的内容自动解码,所以必须保证读取到的内容是一个完整的中文数据,否则解码无效。
1 2 3 | with open ( 'b.txt' , 'rb' ) as f: f.seek( 7 , 0 ) print (f.read().decode( 'utf-8' )) |
3.2、1模式的使用
with open('b.txt', 'rb') as f: f.seek(3, 1) print(f.tell()) f.seek(4, 1) print(f.tell()) 输出结果: 3 7
3.3、2模式的使用
with open('b.txt', 'rb') as f: f.seek(0, 2) print(f.tell()) f.seek(-3, 2) print(f.tell())
输出:
10
7
4、文件的修改方式
方式一、
将文件内容一次性全部读入内存,然后在内容中修改完毕之后再覆盖写回源文件
方式二、
以读文件方式打开源文件,以写方式打开一个临时文件,一行行读取源文件内容,修改完之后写入临时文件,删除源文件,降临时文件重命名为源文件。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了