内容回顾
1.什么是文件?
文件就是操作系统暴露给用户可以操作硬盘的快捷方式
2.代码如何操作文件
关键字open()
分三步:1、利用关键字open打开文件 2、利用其他方法打开 3、关闭文件
# 文件路径:相对路径与绝对路径 当路径中出现了字母与反斜杠的组合产生了特殊含义——>在路径字符串前面加一个r
r'D:\py38\day09\a.txt'
3.代码打开文件的两种方式
open(文件路径,读写模式,字符编码) 文件路径与读写模式是必须的 字符编码是可选的(有些模式需要编码)
方式一:
f = open(文件路径,读写模式,encoding='utf8')
f.close() # 关闭文件释放资源
方式二:
with open('a.txt', 'r', encoding='utf8') as f:
with子代码
with上下文管理好处在于子代码运行结束自动调用close方法关闭资源 在今后代码操作文件推荐使用with语法
with支持一次性打开多个文件
with open() as f1,open() as f2,open() as f3:
with子代码
'''
当我们在编写代码对的时候 有些部分不知道写什么具体代码
补全语法结构 没有实际含义
pass
...
'''
r 模式
'r' 只读模式:只能读不能写
1.文件路径不存在:会直接报错
with open(r't.txt', 'r', encoding='utf8') as f:
print(f.read())
2.文件路径存在:正常读取文件内容
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f..read())
w 模式
'w' 只写模式:只能写不能读
1.文件路径不存在:自动创建
with open(r'b.txt', 'w', encoding='utf8') as f:
pass
2.文件路径存在:先清空文件内容 之后再写入
with open(r'a.txt', 'w', encoding='utf8') as f:
# f.read()报错
f.write('hello world\n')
f.write('hello world\n')
'换行符要自己添加 并且在后续数据读取比对的时候也需注意它的存在'
a 模式
'a' 只追加模式:文件末尾添加数据
1.文件路不径存在:自动创建
with open(r'g.txt', 'a', encoding='utf8') as f:
f.write('我是多么的爱学习啊')
t 文本模式
默认的模式
r w a 实际全称是 rt wt at
1.只能操作文本文件
2.读写都是以字符为单位
3.需要指定encoding参数 如果不知道则会采用计算机默认的编码
b 二进制模式(bytes模式)
不是默认的模式 需要自己指定:rb wb ab
1.可以操作任意类型的文件
2.读写都是以bytes为单位
3.不需要指定的encodinng参数 因为已经是二进制模式了 不需要编码
1.读系列
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.read()) # 一次性读取文件内所有的内容
print(f.readline()) # 每次只读文件一行内容
print(f.readlines()) # 读取文件所有内容 组织成列表 每个元素是文件的每行内容
print(f.readable()) # 判断文件是否具备读的能力
# read() 括号内可以放数字
在t模式下表示字符个数
在b模式下表示字节个数
英文字符统一使用一个bytes来表示
中文字符统一使用三个bytes来表示
for循环
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.read()) # 一次性读取文件内所有内容
print(f.read()) # 一次性读取文件内所有内容
print(f.read()) # 一次性读取文件内所有内容
'''
一次性读完之后 光标停留在了文件末尾就无法再次读取内容
该方法在读取大文件的时候 可能会造成内存溢出的情况
解决上述问题的策略是逐行读取文件内容——>文件变量名f支持for循环 相当于一行行读取文件内容
'''
with open(r'a.txt', 'r', encoding='utf8') as f1:
for line in f1:
line # 涉及到多行内容的情况一般采取for循环读取
2.写系列
with open(r'a.txt', 'w', encoding='utf8') as f:
f.write('我爱学习') # 往文件内写入文本内容
f.write(123) # 报错 写的内容必须写字符串类型
f.writelines(['jaosn', 'kevin', 'tony']) # 可以将列表中多个字符串类型的数据值全部写入
print(f.writeable()) # 判断文件是否具有写的能力
f.flush() # 直接将内存内文件数据刷到硬盘 相当于ctrl+s
with open(r'b', 'rb') as f:
print(f.read(4).decode('utf8'))
print(f.tell()) # 返回光标距离文件开头产生的字节数
f.seek(3, 1)
print(f.read().decode('utf8'))
'''
控制文件内光标的移动 f.seek()
f.seek(offseet, whence)
offset表示位移量
始终以字节为最小单位
正数从左往右移动
负数从右往左移动
whence表示模式
0:基于文件开头 文本和二进制模式都可以使用
1:只支持二进制模式 基于当前位置
2:只支持二进制模式 基于文件末尾
'''
# 1.编写简易版本的拷贝工具
# 自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
# 任何类型数据皆可拷贝
# ps:个别电脑C盘文件由于权限问题可能无法拷贝 换其他盘尝试即可
old_file = input('old_path>>>:')
new_file = input('new_path>>>:')
with open(rf'{old_file}', 'rb') as f, open(r'%s' % new_file, 'wb') as f1:
for line in f:
f1.write(line)
2.利用文件充当数据库编写用户登录、注册功能
# 文件名称:userinfo.txt
# 基础要求:
# 用户注册功能>>>:文件内添加用户数据(用户名、密码等)
# 用户登录功能>>>:读取文件内用户数据做校验
# ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息
# 拔高要求:
# 用户可以连续注册
# 用户可以多账号切换登录(多用户) 文件内有多个用户信息
# ps:思考多用户数据情况下如何组织文件内数据结构较为简单
# 提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件
while True:
print('''
1.注册功能
2.登入功能
''')
choice = input('请输入功能项>>>:').strip()
if choice == '1':
register_name = input('请注册您的用户名>>>:').strip()
register_password = input('请注册您的密码>>>:').strip()
user_info = f'{register_name} {register_password}\n'
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for i in f:
name, pwd = i.split(' ')
if register_name == name:
print('用户已存在')
break
else:
with open(r'userinfo.txt', 'a', encoding='utf8') as info:
info.write(user_info)
print(f'{register_name}用户创建成功')
elif choice == '2':
login_user = input('请登入您的账号>>>:').strip()
login_pwd = input('请输入密码>>>:').strip()
with open(r'userinfo.txt', 'r', encoding='utf8') as info1:
for line in info1:
real_user, real_pwd = line.split(' ')
if login_user == real_user and login_pwd == real_pwd.strip('\n'):
print('登入成功')
break
else:
print('用户名或密码错误')
else:
print('暂无该功能项')