今日内容文件的读写模式
主要是with方法
with也可以同时打开多个文件
格式:
with open(r'', '', encoding='utf8') as 变量名: pass # 为了补全代码的格式,让其不会报错,但实际没有任何代码意义 ... # 这种也是可以
读写功能:
r 全称为read,读的意思;默认的模式
w 全称为write,写的意思
a 也是写的意思,但是与w有所区别
r
当使用该模式的时候,程序就只有读的模式,没有其他模式的权限
当写入路径不存在的时候,会报错
eg:
with open(r'b.txt', 'r', encoding='utf8') as f:
pass
输出结果:
D:python.3.6.4python36.exe D:/pythonProject/day13/02.py
Traceback (most recent call last):
File "D:/pythonProject/day13/02.py", line 1, in
with open(r'b.txt', 'r', encoding='utf8') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'b.txt'
Process finished with exit code 1
当文件路径不存在的时候,系统会报错,并且提示你文件不存在。
当路径存在的时候,系统会打开并等待读取
with open(r'a.txt', 'r', encoding='utf8') as f:
data = f.read()
print(data)
输出结果:
这个时候就会显示出你文件里的东西,但是你只有读的权限
D:python.3.6.4python36.exe D:/pythonProject/day13/02.py
dfdfdsfdf
Process finished with exit code 0
w
当使用该模式的时候,文件只有写的权限
当我们写入的文件不存在的时候,系统会自动给我们创建一个文件
eg:
with open(r'b.txt', 'w', encoding='utf8') as f:
pass
当写入的文件路径存在的时候,我们现在文件里写一些东西
eg:
这里我们先在文件里写入一些东西,然后进行代码操作
with open(r'b.txt', 'w', encoding='utf8') as f:
f.write('123')
然后我们在打开b.txt文件看一下
这里我们可以看到以前的东西没有了
总结:
在w模式下,文件只有写的权限,当文件路径不存在的时候,不会报错,会给我们自动创建一个文件; 当文件路径存在的时候,文件里面有东西的情况下,我们往里面写东西的时候,文件会先清除掉文件 里的动西,然后再写入。
a
在该模式下,文件也只有写的权限。但是与w不同的地方在于,当文件路径存在的时候,我们往里面加东西的时候,不会先清除掉文件里的东西,而是直接在文件末尾追加。
在文件路径不存在的时候
eg:
with open(r'c.txt', 'a', encoding='utf8') as f:
f.write('123') # 123
文件不存在的时候,会先自动创建一个文件,然后再往里面加
当文件存在的时候
eg:
写入代码:
with open(r'b.txt', 'a', encoding='utf8') as f:
f.write('123')
但是这里,我们可以发现,追加的时候,并没有换行追加;因为,没有指令,计算机是不会帮我们做事的。我们可以这样处理:
with open(r'b.txt', 'a', encoding='utf8') as f:
f.write('123n')
文件的操作模式
| t | b |
|---|---|
| 文本模式 | 二进制模式 |
t
文本操作的默认模式
其实上面的读写模式,都是rt,wt,at,只是将t隐藏起来了。
这个模式只支持文本操作。
这个模式操作时,必须加encoding='utf8'
而且读写都是以字符串为单位
b
二进制模式
当要用这种模式的时候,必须加b,不能被省略
这个模式的时候,不用加encoding='utf8'
读写都是以bytes为单位
eg:
with open(r'1.jpg', 'rb') as f:
data = f.read()
print(data)
这个就是图片的二进制
| 操作 | 用法 |
|---|---|
| read() | 一次性读取文件,并且光标停在最末尾 |
| readline() | 一次性读取一行 |
| readlines() | 按照行读取全部内容,然后以列表的形式返回 |
| readable() | 判断读的能力 |
| writable() | 判断写的能力 |
| write() | 只有写的能力,填写文件内容 |
| writelines() | 支持存放多个数据类型的数据值(容器类型) |
今日作业
- 作业一
1.编写简易版本的拷贝工具
自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
任何类型数据皆可拷贝
ps:个别电脑C盘文件由于权限问题可能无法拷贝 换其他盘尝试即可
代码:
l1 = input('请输入你需要复制的文件路径:').strip()
l2 = input('请输入你拷贝的文件路径:').strip()
# 先读取输入文件信息
with open(fr'{l1}', 'rb') as f:
txt = f.read() # 将其赋值起来
# 创建一个文件
with open(fr'{l2}', 'wb') as f:
f.write(txt) # 将读出来的文件写进去
- 作业二
2.利用文件充当数据库编写用户登录、注册功能
文件名称:userinfo.txt
基础要求:
用户注册功能>>>:文件内添加用户数据(用户名、密码等)
用户登录功能>>>:读取文件内用户数据做校验
ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息
拔高要求:
用户可以连续注册
用户可以多账号切换登录(多用户) 文件内有多个用户信息
ps:思考多用户数据情况下如何组织文件内数据结构较为简单
提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件
代码:
is_tage = True
print('欢迎来到xxx系统')
while is_tage:
# 打开文件,刚开始是没有的
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
txt = f.read()
print('''
"1 注册"
"2 登录"
"3 退出系统"'''
)
num = input("请输入你的指令:")
# 注册,如果用户存在,则提示,并返回,如果不存在,创建在表里
if num == '1':
name = input('请输入你注册的用户名:').strip()
new_name = name + '|' # 新建变量名绑定库里的名字加|,用于判断用户名是否存在
# for循环判断用户名是否存在
for line in txt:
if new_name in txt:
print('用户已存在')
break
# for循环循环完,或者不满足条件的时候进行
else:
pwd = input('请输入你注册的密码:').strip()
pwd1 = input('请确认密码:').strip()
if pwd1 != pwd:
print('密码不正确!')
continue
# 文件不存在,会自动创建文件
with open(r'userinfo.txt', 'a', encoding='utf8') as f:
f.write(f'{name}|{pwd}n') # 用字符串的格式化往库里尾部追加用户信息,并且换行
print('注册成功!')
elif num == '2':
# 循环3次
for i in range(3):
if is_tage == True:
username = input('请输入你的用户名:').strip()
password = input('请输入你的密码:').strip()
res1 = ('|'.join((username, password)))
# 读取文件,并且赋值
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
txt = f.read()
if res1 in txt:
print('登录成功!')
is_tage = False
i = input('是否想清理你的数据库(s/n):')
# 清空数据库的数据值
if i == 's':
q = open('userinfo.txt', 'r+')
q.truncate()
print('已清理,欢迎下次光临!')
else:
print('退出成功')
is_tage = False
else:
print('用户名或者密码输入错误!')
continue
if is_tage == True: # 全局标志位
sum = input('你已经输入三次了,是否重新注册(y/q):').strip()
if sum == 'y':
continue
else:
print('退出页面,欢迎下次光临!')
break
elif num == '3':
print('欢迎下次光临!')
is_tage = False
else:
print('未收到正确指令')



