8 文件操作

    技术2022-07-10  148

    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 jsonpython数字数字字符串字符串(可能将双引号变为单引号)布尔布尔(小写变大写)数组列表字典字典空值空值(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 pythonjson数字数字字符串字符串(单引号变成双引号)布尔布尔(大写变成小写)列表/元组数组字典字典(关键字是字符串)Nonenull # 使用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()

    运行结果如下: 输入相应序号即可进入相应功能。

    Processed: 0.011, SQL: 9