【python基础】第13回 文件处理 模式与方法
本章内容概要
文件的读写模式
文件的操作模式
文件操作的诸多方法
文件拷贝
本章内容详情
1.文件的读写模式
1.1 补充知识
1.with 语法支持一次性打开多个文件
with open( r'a.txt', 'r', encoding='utf8') as f1,open(r'b.txt', 'r', encoding='utf8') as f2: pass
2.补全python 语法 但是不执行任何操作
pass 推荐使用
...不推荐使用
3.通常情况下英语单词的结尾如果加上了able 表示具备该单词描述的能力
readable 具备读取内容的能力
writable 具备填写内容的能力
1.2 r 只读模式 默认的模式
使用该模式打开的文件只能读取内容 不能做其他操作(如 写)
1.文件路径不存在:r模式直接报错
with open(r'a.txt', 'r', encoding='utf8') as f1: pass
2.文件路径存在:r 模式会打开文件等待读取文件内容
with open(r'a.txt', 'r', encoding='utf8') as f1: print(f1.read())
1.3 w 只写模式
使用该模式打开的文件只能写内容 不能做其他操作(如读)
1.文件路肩不存在:w模式会自动创建该文件
with open(r'b.txt', 'w', encoding='utf8') as f: pass
2.文件路径存在:w模式会先清空该文件内容 之后等待填写新内容
with open(r'a.txt', 'w', encoding='utf8') as f: pass
1.4 a 只追加模式
使用该模板打开的文件默认是在末尾追加新的内容 不能做其他操作(如 读)
1.文件路径不存在:a 模式会自动创建文件
with open(r'c.txt', 'a', encoding='utf8') as f: pass
2.文件路劲存在: a 模式不会先清空该文件内容 只在文件末尾等待填写新的内容
with open(r'a.txt', 'a', encoding='utf8') as f: f.write('追加\n')
2.文件的操作模式
2.1 t 文本模式
文件操作的默认模式
r rt
w wt
a at
1.只能操作文本文件
2.必须指定encoding参加
3.读写都是以字符串为单位
2.2 b 二进制模式
rb wb ab 必须自己指定 不能省略
1.能够操作所有类型的文件
2.不需要指定encoding参数
3.读写都是以bytes为单位
3.文件操作的诸多方法
3.1 read()
一次性读取文件内容并且光标会停留在文件末尾 继续读则为空
例; 当文件数据较大的时候 不推荐一次性读取
100G 的文件 16G读取 用 循环读取
with open(r'a.txt', 'r', encoding='utf8') as f: for i in f: print(i)
with open(r'a.txt', 'r', encoding='utf8') as f: data = f.read() # 一次性读取文件 print(data) data1 = f.read() # 读完 文件光标到末尾 后面无内容 print(data1)
3.2 readline() 一次只读一行内容
with open(r'a.txt', 'r', encoding='utf8') as f: data = f.readline() print(data) data1 = f.readline() print(data1)
3.3 readlines() 按照行的方式读取所有的内容并组织成列表返回
with open(r'a.txt', 'r', encoding='utf8') as f: data = f.readlines() print(data)
3.4 readable() 判断当前文件是否可读
3.5 writable() 判断当前文件是否可写
with open(r'a.txt', 'r', encoding='utf8') as f: # data = f.readlines() # print(data) print(f.readable()) # Ture print(f.writable()) # False
3.6 write() 填写内容
with open(r'b.txt', 'w', encoding='utf8') as f: f.write('填写')
3.7 wrutelines() 支持填写容器类型(内部可以存放多个数据值的数据类型)多个数据值
with open(r'b.txt', 'w', encoding='utf8') as f: f.writelines(['zhang\n', 'jason\n', 'li\n'])
3.8 flush() 将内存中的文件数据立刻刷到硬盘(主动按ctrl+s)
with open(r'b.txt', 'w', encoding='utf8') as f: f.flush() # 将内存中的文件数据立刻刷到硬盘(主动按ctrl+s)
4.文件拷贝
4.1 文本拷贝
# 拷贝功能
with open(r'a.txt', 'r', encoding='utf8') as f: data = f.read() with open(r'aaa.txt', 'w', encoding='utf8') as f: f.write(data)
4.2 二进制拷贝
with open(r'pp.png', 'rb') as read_if,open(r'22.png', 'wb') as write_if: data = read_if.read() write_if.write(data)
作业
# 1.编写简易版本的拷贝工具
# 自己输入想要拷贝的数据路径
# 自己输入拷贝到哪个地方的目标路径
# 任何类型数据皆可拷贝
# ps: 个别电脑C盘文件由于权限问题可能无法拷贝
# 换其他盘尝试即可
path = input('请输入要拷贝的路径>>:').strip() with open(fr'{path}', 'rb') as read_if: data = read_if.read() path_copy = input('请输入要拷贝到路径>>:').strip() with open(fr'{path_copy}', 'wb') as write_if: write_if.write(data)
# 1.先获取想要拷贝的数据路径
# source_file_path = input('请输入想要拷贝的数据路径>>>:').strip() # a.txt
# # 2.再获取拷贝到哪个地方的目标路径
# target_file_path = input('请输入拷贝到哪个地方的目标路径>>>:').strip() # b.txt
# # 3.读取想要拷贝的数据路径对应的内容 并写入到目标路径中
# """
# 1.合并代码
# 2.路径如何添加r取消转移
# """
# with open(r'%s' % source_file_path, 'rb') as f1, open(r'%s' % target_file_path, 'wb') as f2:
# for line in f1: # 循环读取文件中一行行内容
# f2.write(line) # 依次写入新的文件
# 2.
# 利用文件充当数据库编写用户登录、注册功能
# 文件名称: userinfo.txt
# 基础要求:
# 用户注册功能 >> >: 文件内添加用户数据(用户名、密码等)
# 用户登录功能 >> >: 读取文件内用户数据做校验
# ps: 上述功能只需要实现一次就算过关(单用户)
# 文件内始终就一个用户信息
# 拔高要求:
# 用户可以连续注册
# 用户可以多账号切换登录(多用户)
# 文件内有多个用户信息
# ps: 思考多用户数据情况下如何组织文件内数据结构较为简单
# 提示: 本质其实就是昨天作业的第二道题
# 只不过数据库由数据类型变成文件
username = input('请注册你的用户名>>:').strip() password = input('请设置你的密码>>:').strip() with open(r'userinfo.txt', 'w', encoding='utf8') as write_user: write_user.writelines({f'{username},{password}'}) print('注册成功') with open(r'userinfo.txt', 'r', encoding='utf8') as read_user: data = read_user.read().split(',') name = input('请登录你的用户名>>:').strip() word = input('请输入你的密码>>:').strip() if name == data[0] and word == data[1]: print('登录成功') else: print('账号或密码错误')
# while True:
# print("""
# 1.注册功能
# 2.登录功能
# 3.退出程序
# """)
# func_id = input('请输入功能编号>>>:').strip()
# if func_id == '1':
# # 1.获取用户名
# username = input('请输入用户名>>>:').strip()
# # 2.判断当前用户名是否已存在
# # 2.1.读取数据文件
# with open(r'userinfo.txt', 'r', encoding='utf8') as f:
# # 2.2.循环获取文件内容(一个个用户数据)
# for line in f: # jason|123 kevin|321 tony|222
# # 2.3.拆分出真实用户名 比对
# real_name = line.split('|')[0]
# # 2.4.判断用户名书否已存在
# if username == real_name:
# print('用户名已存在')
# break
# else:
# # 一定要理解循环与break continue else的组合使用
# password = input('请输入密码>>>:')
# # 3.构造用户数据
# user_data = '%s|%s\n' % (username, password)
# # 4.打开并写入文件
# with open(r'userinfo.txt', 'a', encoding='utf8') as f:
# f.write(user_data)
# # 5.温馨提示
# print(f'用户{username}注册成功')
# elif func_id == '2':
# # 1.获取用户数据
# username = input('username>>>:').strip()
# password = input('password>>>:').strip()
# # 2.读取文件内容
# with open(r'userinfo.txt', 'r', encoding='utf8') as f:
# # 2.1.循环读取每个真实用户的数据
# for line in f: # oscar|666 jerry|789
# # 2.2.拆分真实用户名和密码
# real_name, real_pwd = line.split('|') # 注意密码后面有换行符
# # 2.3.判断用户输入的数据与真实数据是否一致
# if username == real_name and password == real_pwd.rstrip('\n'):
# print('登录成功')
# break
# else:
# print('用户名或密码错误')
# elif func_id == '3':
# print('欢迎下次再来哦')
# break
# else:
# print('输入不合法!!!')