文件操作
-
将内存中的数据持久化保存到文件中
【一】打开文件的两种方式
【1】使用open语句
-
三种模式: w:覆盖写 a:追加写 r:读
-
参数(文件路径,打开文件的模式,编码格式)
(1)打开文件并付给句柄对象
fp = open('01.text', 'r', encoding='utf-8') print(fp) # <_io.TextIOWrapper name='01.text' mode='r' encoding='utf-8'>
(2)读取所有文件数据
data = fp.read()
(3)打印
print(data) fp.close() # 关闭文件
【2】with语句
-
在with语句内部打开文件
with open('01.text', 'r', encoding='utf-8') as fp: data = fp.read() print(data) # gdy|123
【二】文件的操作模式
【1】读 r
with open('01.text', 'r', encoding='utf8') as fp: data = fp.read() user = data.split('|') print(user) # ['gdy', '123']
-
已经学过字符串的格式化语法
-
f : 格式化输出
-
b : 将字符串转为二进制
-
r : 取消 \ 转义
-
print('a\\nb') # a\nb print(r'a\nb') # a\nb
-
# 加r和不加r的区别,不加r会出现乱码 print(r'D:\Python\PythonProjects\PythonProjects29\day10\01.text') # D:\Python\PythonProjects\PythonProjects29\day10\01.text print('D:\Python\PythonProjects\PythonProjects29\day10\01.text') # D:\Python\PythonProjects\PythonProjects29\day10•.text
-
【2】覆盖写 w
-
覆盖写
-
文件名存在则打开,不存在则新建
-
功能:打开当前文件并且将文件内容清空 然后写入新的内容
(1)一次性写入
data = 'opp|366' with open(file='01.text', mode='w', encoding='utf8') as fp: # fp.write(写的内容) fp.write(data)
(2)连续写入
data = 'gdy|666' with open(file='01.text', mode='w', encoding='utf8') as fp: fp.write(data) fp.write("666")
fp = open('01.text', 'w', encoding='utf-8') # 打开文件开始写入 fp.write('aaa') fp.write('bbb') fp.write('ccc') fp.write('ddd') fp.close() # 关闭文件以后无法再写入 # I/O operation on closed file. 文件已经关闭无法再继续操作 fp.write('9999') # aaabbbcccddd
【3】追加写 a
-
文件不存在则新建并写入
-
文件存在则打开并继续写入
-
不会自带换行功能
data = 'dream|666' with open('01.text', 'a', encoding='utf8') as fp: fp.write(data + '\n') # 每执行一次就增加一行dream|666
【三】文件操作模式补充
【1】文本编辑模式
-
w / a / r
-
完整的模式应该是wt / at / rt
-
大文本编辑模式
【2】二进制数据模式
wb / rb
with open('img.png', 'rb') as fp: data = fp.read() with open('girl.jpg', 'wb') as fp: fp.write(data)
【四】文件操作扩展模式
r+ / w+ / a+
r : 只读
w : 只写无法读
with open('01.text', 'r+', encoding='utf-8') as fp: fp.write('666') # 写完以后需要进行持久化保存才能被读出来,否则是空的 data = fp.read() print(data)
【五】文件的操作方法详细
data = 'gdy|123' with open('01.text', 'a', encoding='utf8') as fp: fp.write(data + '\n') # 运行一次就会增加一行gdy|123
【1】r模式的方法详细
(1)一次性全部读完
with open('01.text', 'r', encoding='utf8') as fp: data = fp.read() print(data)
(2)每次只读一行
with open('01.text', 'r', encoding='utf8') as fp: count = 0 while True: count += 1 data = fp.readline() # readline 逐行读取文件 if data: print(count, data) else: break
(3)一次性读很多行,把所有数据读出来后放到一个列表中
with open('01.text', 'r', encoding='utf8') as fp: data = fp.readlines() # .readlines([sizeint]) # 读取所有行并返回列表若给定sizeint>0则只读取第一行字符,且带‘\n’,也以列表格式输出 print(data) # ['gdy|123\n', 'gdy|123\n']
(4)测试当前对象是否可读
with open('01.text', 'r', encoding='utf8') as fp: print(fp.readable()) # True readable()测试当前文件是否可读,返回布尔值 fp = open('01.text', 'r', encoding='utf8') fp.close() print(fp.readable()) # 报错
【2】写模式的操作方法
(1)一次性写入新内容
with open('01.text', 'a', encoding='utf-8') as fp: fp.write('666') # 666
(2)逐个元素进行写入
data_list = ['111', '\n', '222','\n'] with open('01.text', 'a', encoding='utf-8') as fp: fp.writelines(data_list) # 111 # 222
【六】控制文件内指针移动
with open('01.text', 'r', encoding='utf8') as fp: # read 可以放参数,参数是读取到哪个索引位置 data = fp.read(8) # 换行也算一个移动指针 print(data) # 999 # 111
【七】seek函数
-
想要读取文件内指定位置的内容就需要seek函数(指针移动的字节数,模式控制):
-
三种模式
-
0:以文件开头作为参照
-
1:以当前所在位置作为参照
-
2:以文件末尾的位置作为参照
-
# 0模式 with open('01.text', 'rt', encoding='utf-8') as fp: fp.seek(6, 0) print(fp.tell()) # 6 print(fp.read()) # 英文占一个字符,中文占三个字符 # 从第6个字符向后读 # 1模式 with open('01.text', 'rb') as fp: # 英文占一个字节 (一个字符) # 中文占三个字节 (一个字符) print(fp.read()) # b'\xe5\x9b\xbd99\r\n\xe4\xbd\xa011\r\n\xe7\xac\xac22\r\n333\r\n444\r\n555' fp.seek(3, 1) print(fp.tell()) # 37 print(fp.read()) # b'' fp.seek(3, 1) print(fp.tell()) # 40 print(fp.read()) # b'' # 2模式 with open('01.text', 'rb') as fp: print(fp.read()) fp.seek(0, 2) print(fp.tell()) fp.seek(-4, 2) print(fp.read())
小练习
# 【一】登录 input_username = input(f"请输入账号:").strip() input_password = input(f"请输入密码:").strip() with open(r'01.text', mode='r', encoding='utf8') as f: for line in f: username, password = line.strip('\n').split(':') if username == input_username and password == input_password: print(f"登录成功") break else: print(f"账号密码输入错误") # 【二】注册 username = input("请输入用户名:").strip() password = input("请输入密码:").strip() with open('02.text', 'a', encoding='utf-8') as f: info = '%s:%s\n' % (username, password) f.write(info)