8 文件操作
8.1 计算机存储方式
计算机的存储系统分为运行内存和硬盘两种
- 运行内存:用来保存程序运行过程中产生的数据,程序运行结束后会自动销毁。
- 硬盘:用来保存文件,保存在文件的数据也存放在硬盘中。除非手动删除,否则数据会一直存在。
使用文件的目的:
就是把一些数据存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力
8.2 文件操作
- 数据持久化
数据持久化是将数据以各种形式保存到硬盘中(保存到本地文件中)
- 文件操作
文件操作基本步骤:打开文件 —> 操作文件(读、写)—>关闭文件
1) 打开文件
- 方式一:
open(file,mode = 'r', encodinh = 'None')
# 以指定的模式打开指定文件并且返回一个文件对象
'''说明:
a. file - 文件路径:字符串类型
(绝对路径、相对路径)
b. mode - 打开方式,字符串类型
第一组:控制操作类型
r - 以只读的方式打开文件
w - 以只写的方式打开文件
a - 以可追加的方式打开文件
第二组:控制数据类型(文本/二进制数据)
t - 操作的数据是文本数据(默认值)
b - 操作的数据是二进制数据
注意:每一组值只能选一个,两组值进行组合使用
c. encoding - 文本编码方式,一般写'utf-8'
注意:如果打开方式中带b,则不能设置 encoding
'''
将数据转换为二进制的方式:
# 在字符串前方加个b可将字符串转换成二进制数据
f.write(b'how are you?')
# 强制类型转换
f.write(bytes('how are you?'), encoding='utf-8')
总结:
文本文件打开的时候可以是t
,也可以是b
;二进制文件只能是b
- 方式二:
with open(file,mode = 'r', encodinh = 'None') as 文件对象:
操作文件对象
2)文件的读操作
对象.read() - 从文件读写位置开始,读到文件的结尾(默认情况下读写位置在文件开头)
文件对象.readline() - 读文本的一行内容(从当前读写位置读到一行结束)
文件对象.readlines() - 一行一行的读,读完为止。返回值是一个列表,列表中的元素是每一行的内容。
练习:一行一行的读文件,读完为止。
def read_file(file):
with open(file,'r',encoding='utf8') as f:
while True:
c = f.readline()
if not c:
break
print(c)
3)文件的写操作
文件对象.write(内容)
注意:如果以读的方式打开一个不存在的文件,程序会报错!如果以写或追加的方式打开一个不存在的文件,会在当前目录下自动新建这个文件。
练习:写个程序统计这个程序启动的次数。
数据持久化的基本操作:
1.数据保存在文件中;
2.需要数据从文件中读数据;
3.当数据放生改变时,对保存数据的文件进行更新。
with open('count.txt', encoding='utf8') as file:
content = file.read()
count = int(content)
count += 1
print(count)
with open('count.txt', 'w', encoding='utf8') as file:
file.write(str(count))
# 在count.txt 中有一个值 0
练习:实现添加学生的功能,要求每次运行程序添加的学生,下次还在。
def add_stu(stu):
with open('stu.txt', 'a', encoding='utf8') as f:
f.write(stu)
with open('stu.txt', 'r', encoding='utf8') as f:
print(f.read())
add_stu('zhangsan\n')
add_stu('李四\n')
补充:
- 字典和列表的写操作:先将列表或者字典转换成字符串
with open('stu.txt','w',encoding = 'utf8') as f:
f.write(str(students))
- 字典和列表的读操作:将容器式的字符串转换成对应的容器型数据类型(eval)
with open('stu.txt','r',encoding='utf8') as f:
content = f.read()
print(content)
print(type(content))
new_content = eval(content)
print(new_content)
print(type(new_content))
for item in new_content:
print(item)
print(type(item))
def add_student():
name = input('姓名:')
age = input('年龄:')
tel = input('电话:')
stu = {'name': name, 'age': age, 'tel': tel}
with open('students.txt', 'r', encoding='utf-8') as f:
all_students = eval(f.read())
all_students.append(stu)
with open('students.txt', 'w', encoding='utf-8') as f:
f.write(str(all_students))
print(all_students)
add_student()
8.3 json
1.什么是json?
- 存在的意义:json就是不同编程语言之间进行数据交流的一种通用格式。
- 概念:json是一种数据格式
- 一个json有且只有一个数据
- 这个数据必须是json支持的数据类型的数据
- json支持的数据类型
- 数字类型:所有的数字,直接用阿拉伯数字表示且支持科学计数法
- 字符串:只能使用双引号(支持转义字符)
- 布尔:只有 true 和 false (小写)两个值
- 数组:相当于python中的列表,[元素1,元素2,…]
- 字典/对象:相当于python中的字典,{key1:value1, key2:value2,…},在json中key只能是字符串
- null(空值):相当于python中的None
- json 转 python
json | python |
---|---|
数字 | 数字 |
字符串 | 字符串(可能将双引号变为单引号) |
布尔 | 布尔(小写变大写) |
数组 | 列表 |
字典 | 字典 |
空值 | 空值(null 变为 None) |
# 使用json模块中的loads
'''
json.loads(字符串) - 将json格式的字符串转换成python对应的数据
注意:字符串的内容必须满足json格式
'''
import json
res = json.loads('"abc"')
print(res) # abc
res = json.loads('true')
print(res) # True
res = json.loads('[100,"abc",true,null]')
print(res) # [100,'abc',True,None]
- python 转 json
python | json |
---|---|
数字 | 数字 |
字符串 | 字符串(单引号变成双引号) |
布尔 | 布尔(大写变成小写) |
列表/元组 | 数组 |
字典 | 字典(关键字是字符串) |
None | null |
# 使用json模块中的dumps
'''
json.dumps - 将指定的python数据转换成json格式的字符串
'''
res = json.dumps([100,'abc',True,(10,20),None])
print(res) # [100,"abc",true,[10,20],null]
print(type(res)) # str
8.4 登录系统
将文件相关操作放入fileManager.py
模块中,模块内容如下:
import json
def read_file(file_name):
"""
普通文本文件的读操作
:param file_name: 被读的文件的名字
:return: 读到的文件内容
"""
with open(f'files/{file_name}', 'r', encoding='utf-8') as f:
return f.read()
def read_json_file(file_name):
"""
json文件的读操作
:param file_name: 文件名
:return: python类型的文件内容
"""
with open(f'files/{file_name}', 'r', encoding='utf-8') as f:
content = f.read()
return json.loads(content)
def write_json_file(file_name, data):
"""
json文件的写操作
:param file_name: 文件名
:param data: 被写入的python数据
:return: None
"""
content = json.dumps(data)
with open(f'files/{file_name}', 'w', encoding='utf-8') as f:
f.write(content)
在另一个文件loginManager
中写入如下内容,控制登录界面:
from fileManager import read_file,read_json_file, write_json_file
"""
用户信息数据结构设计:
[
{'username':'abc', 'password': '123456},
{'username':'abc', 'password': '123456},
{'username':'abc', 'password': '123456}
]
"""
def login():
username = input('请输入账号:')
password = input('请输入密码:')
all_user = read_json_file('users.json')
for user in all_user:
if user['username'] == username:
if user['password'] == password:
print('登录成功!')
# 实现登录成功后要完成的功能!
else:
print('登录失败!密码错误!')
break
else:
print('登录失败!该账号没有注册!')
def register():
# 输入账号密码
user_name = input('请输入账号:')
password = input('请输入密码:')
# 获取之前注册过的所有的账号
all_user = read_json_file('users.json')
# 判断输入的账号是否已经注册过
for user in all_user:
if user['username'] == user_name:
print('注册失败!该账号已经注册过!')
break
else:
all_user.append({'username': user_name, 'password': password})
write_json_file('users.json', all_user)
print('注册成功!')
def main():
# 获取主页的显示内容
main_page = read_file('mainpage')
while True:
# 显示主页
print(main_page)
value = input('请选择(1-3):')
if value == '1':
print('============登录===============')
login()
elif value == '2':
print('=============注册===============')
register()
elif value == '3':
# print('退出')
# break
# return
exit() # 退出程序(退出线程)
else:
print('输入有误!')
if __name__ == '__main__':
main()
运行结果如下:
输入相应序号即可进入相应功能。