Day 15
一、数据持久化
** 怎么将程序中的数据保存在文件中?**
** 怎么在程序中获取文件中的内容?**
** 答案是 文件操作 **
1.计算机存储数据
- 默认情况下程序中的数据是保存在运行内存中,当程序运行结束,在运存内存中保存的数据会自动销毁。
- 如果希望在这次运行程序的时候,可以使用上一次运行程序产生的数据,就必须把数据保存在硬盘(磁盘)中。
- 硬盘保存数据的最小单位是文件
2.数据持久化 – 将数据以文件的形式保存在磁盘中
- 对文件进行保存读取一系列的文件操作
3.文件操作 - 操作文件的内容
- 基本流程
打开文件 → 文件读写操作 → 关闭文件
二、 打开文件
-
open(file,mode=‘r’,*,encoding=None) --以指定方式打开指定文件,返回一个文件对象
-
参数1 – file : 需要打开的文件路径(文件可以写绝对路径,也可以写相对路径)
- 绝对路径:文件在计算机中的全路径(Windows从盘开始写的路径)
- 相对路径:在写文件路径的时候可以用 ‘.’ 代表当前目录或者用用 '…'代表当前目录的上层目录(当前目录指定的是当前代码文件所在的文件夹)
- 注意:如果要使用相对路径,被打开的文件必须放在工程中
- 如果路径是以 ‘’.‘’ 开头 可以省略
-
参数2 --mode:文件打开方式,用来决定打开文件能做什么(能读还是能写)、操作文件的时候数据对应的类型(是字符串还是二进制 )
-
给 mode 赋值的时候需要两组值
-
第一组 :决定打开后能做什么的值
- r : 只读,打开不存在的文件会报错
- w:只写 — 打开文件时,会清空掉原来文件中内容,打开不存在的文件会新建一个文件
- a : 只写 — 追加写入,打开不会清空原文件,打开不存在的文件会新建一个文件
-
第二组:决定操作文件的时候数据的类型
- t:字符串
- b:二进制(bytes)
-
赋值的时候上面两组值每一组都必须选择一个(如果第二组值不选,就默认为 ‘’ t ‘’ )
-
以只读的方式无法写入
f = open('./files/abc.py','r')
f.read()
f.write('123') # 报错 io.UnsupportedOperation: not writable(不能写入)
- 以只写的方式无法读
f = open('./files/abc.py','r')
f.write('123')
f.read() # 报错 io.UnsupportedOperation: not readable(不能读)
- 参数3:encoding - - 文本文件编码方式(只有在文件以 t 方式打开的时候才需要设置encoding)一般赋值为 ’ utf-8 ',’‘gbk“ 也是一种常见的编码方式
- ’ utf-8 ’ :在文本数据存储的时候,ascii表中的符号用一个字节来存储,一个中文用3个字节存储。可以对任何符号编码
- ’ gbk ’ : 文本数据在存储的时候,acsii表中的符号用一个字节来存储,一个中文用2个字节存储。除了acsii表和中文以外不能存储其他字符
- 使用编码原则:存储数据的时候要和使用编码值要和 获取数据的时候对应的编码值抑制
三、.文件的读写操作
1. 文件读操作
- 文件.read() : 获取整个文件内容(从读写位置开始,读到文件结束。读写位置默认在文件开头,随着读操作的进行读写位置会不断改变)
- 文件.readline() : 获取文件内容一行只对文本文件有效
- 文件.readlines() :获取整个文本内容,内容以列表的形式返回 ,列表中的元素是每一行的内容对文本文件有效
2.文件的写操作
- write
- writerline
四、文件操作的应用
1.文件持久化的步骤
1)确定需要持久化的数据
2)创建保存需要持久化数据的文件
3)确定文件初始内容(就是需要持久化的数据的初始值)
4)在程序中需要这个数据的时候从文件中获取这个数据
5)在程序中修改数据后,必须将最新的数据写入到文件中
- 练习:提示用户输入名字添加学生,添加完后打印已经添加过的所有的学生的名字
"""
# 第1次运行程序:
请输入你的名字: 小明
小明
# 第2次运行程序:
请输入你的名字:小花
小明 小花
# 第3次运行程序
请输入你的名字: 张三
小明 小花 张三
....
"""
# 1)确定需要持久化的数据 - 已经添加过的学生的名字
name = input('请输入你的名字:')
# 4)在程序中需要这个数据的时候从文件中获取这个数据
added_name = open('files/student.txt', encoding='utf-8').read() + name
print(added_name)
# 5)5)在程序中修改数据后,必须将最新的数据写入到文件中
f = open('files/student.txt', 'a', encoding='utf-8')
f.write(name+' ')
- 作业:登录注册系统
f1 = open('./界面.txt', 'r', encoding='utf-8')
print(f1.read())
f1.close()
while True:
# 登录、注册前预加载用户信息
f2 = open('./用户信息.txt', 'r', encoding='utf-8')
result = f2.readlines()
print(result)
f2.close()
# 处理信息
user_list = [i.replace('\n', '').split(',')[0] for i in result[1:]]
password_list = [i.replace('\n', '').split(',')[1] for i in result[1:]]
print(user_list, password_list)
choice = input('请输入你的选择:')
if choice == '1':
username = input('请输入用户名:')
password = input('请输入密码:')
if username in user_list:
index1 = user_list.index(username)
if password == password_list[index1]:
print('登录成功')
break
else:
print('用户名或密码错误')
else:
print('用户名或密码错误')
elif choice == '2':
f3 = open('./用户信息.txt', 'a', encoding='utf-8')
username = input('请输入用户名:')
if username in user_list:
print('用户名已存在')
else:
password = input('请输入密码:')
f3.write('\n' + ','.join([username, password]))
f3.close()
print('注册成功')
elif choice == '3':
print('退出系统')
break
else:
print('输入错误,请重新输入!')