09 文件处理
一、文件操作的基本流程
1.基本流程
(1)打开文件,由应用程序向操作系统发起调用open(),操作系统打开该文件,对应一块硬盘空间,并返回一个文件对象赋值给一个变量f f=open("a.txt",mode="rt",encodind="utf-8") (2)调用文件对象下的读写方法,会被操作系统转换为读/写硬盘的操作 date=f.read() (3)向操作系统发起关闭文件的请求,回收系统资源 f.close()
2.with
(1) 在执行完子代码块后,with会自动执行f.close()
with open('db.txt',mode='rt',encoding='utf-8') as f: print(f.read()) print('='*50) print(f.read())
(2)可用用with同时打开多个文件,用逗号分隔开即可
with open('db.txt',mode='rt',encoding='utf-8') as f,\ open('b.txt',mode='rt') as f1: print(f.read()) print('='*50) print(f.read())
二、文件的操作模式
1.控制文件读写内容的模式
(1) t模式的使用:(默认):
1. 读写文件都是以字符串为单位的
2. 只能针对文本文件
3. 必须指定encoding参数
(2) b模式的使用;
1.读写文件都是以bytes/二进制为单位的
2. 可以针对所有文件
3. 一定不能指定encoding参数
2.控制文件读写操作的模式
(1)r模式的使用:只读模式
文件不存在则报错,如果文件存在则指针置于文件开头 with open("a.txt",mode="rt",encoding="utf-8") as f: print(f.read())
小练习:
实现用户认证功能 inp_user = input("请输入您的名字").strip() inp_pwd = input("请输入您的密码").strip() f=open(r"a.txt",mode="rt",encoding="utf-8") for line in f: user,pwd=line.strip("\n").split(":") if inp_user == user and inp_pwd == pwd: print("登录成功") break else: print("登录失败") f.close()
(2)w模式的使用:只写模式
在文件不存在时创建空文档,文件存在会清空文件,文件指针会跑到文件的开头 with open("b.txt",mode="wt",encoding="utf-8") as f: f.write('你好\n') f.write('我好\n') f.write('大家好\n') f.write('111\n222\n333\n')
强调:
1 在文件不关闭的情况下,连续的写入,后写的内容一定跟在前写内容的后面
2 如果重新以w模式打开文件,则会清空文件内容
(3)a模式的使用:只写(追加)
a只追加写模式: 在文件不存在时会创建空文档,文件存在会将文件指针直接移动到文件末尾 with open(“c.txt",mode="at",encoding="utf-8") as f: f.write("444\n") f.write("555\n") 强调 w 模式与 a 模式的异同: 1 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后 2 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后
案例:实现注册功能
name = input("username===>").strip()
pwd = input("password===>").strip()
with open("a.txt",mode="a",encoding="utf-8") as f:
info=("%s:%s\n"%(name,pwd))
f.write(info)
三、修改文件的2种方式:
# 思路一:
# with open('b.txt',mode='rt',encoding='utf-8') as f1:
# data = f1.read()
# res = data.replace('egon','EGON')
#
# with open('b.txt',mode='wt',encoding='utf-8') as f2:
# f2.write(res)
# 思路二
import os
with open('b.txt',mode='rt',encoding='utf-8') as f1,open('.b.txt.swp',mode='wt',encoding='utf-8') as f2:
for line in f1:
f2.write(line.replace('EGON','egon'))
os.remove('b.txt')
os.rename('.b.txt.swp','b.txt')
练习:
# 注册 # inp_user = input("请输入您的用名:").strip() # inp_pwd = input("请输入您的密码:").strip() # inp_money = input("请输入您的余额:").strip() # # with open('db.txt', mode='at', encoding='utf-8') as f: # f.write('%s:%s:%s\n' % (inp_user, inp_pwd, inp_money)) # 转账 import os with open('db.txt',mode='rt',encoding='utf-8') as f1,open('.db.txt.swp',mode='wt',encoding='utf-8') as f2: for line in f1: user,pwd,money = line.strip('\n').split(':') if user == 'tom': money = int(money) - 100 elif user == 'lili': money = int(money) + 100 line = "%s:%s:%s\n" % (user, pwd, money) f2.write(line) os.remove('db.txt') os.rename('.db.txt.swp','db.txt')
四、文件读写的其他方式
with open('b.txt',mode='rt',encoding='utf-8') as f: print(f.readable()) print(f.readline()) print(f.readline()) lines = f.readlines() print(lines[0]) with open('b.txt', mode='wt', encoding='utf-8') as f: print(f.writable()) lines = ['你好\n', '我好\n', '大家好\n'] for line in lines: f.write(line) f.writelines(lines) f.write('1111\n222\n333\n') f.write('hello') f.writelines('hello') with open('b.txt', mode='at', encoding='utf-8') as f: f.truncate(3)
五、控制文件指针移动
储备知识:只有t模式下的read(n)的n代表的是字符个数,除此以外都代表字节个数 with open('b.txt',mode='rt',encoding='utf-8') as f: print(f.read(4)) with open('b.txt',mode='rb') as f: print(f.read(3).decode('utf-8')) f.seek(移动的字节个数,模式) 模式: 0:参照文件开头,只有0模式可以在t下使用,其他的都只能在b下使用 with open('b.txt',mode='rt',encoding='utf-8') as f: f.seek(3,0) f.seek(6,0) print(f.tell()) 1:参照指针当前所在的位置,只能在b下使用 with open('b.txt',mode='rb') as f: f.seek(3,1) f.seek(6,1) print(f.tell()) 2:参照指针文件末尾,通常是倒着移动,只能在b下使用 with open('b.txt',mode='rb') as f: f.seek(-5,2) f.seek(-8,2) print(f.tell()) print(f.read().decode('utf-8'))