8 文件操作

8 文件操作

8.1 计算机存储方式

计算机的存储系统分为运行内存和硬盘两种

  • 运行内存:用来保存程序运行过程中产生的数据,程序运行结束后会自动销毁。
  • 硬盘:用来保存文件,保存在文件的数据也存放在硬盘中。除非手动删除,否则数据会一直存在。

使用文件的目的:

就是把一些数据存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力

8.2 文件操作

  1. 数据持久化

数据持久化是将数据以各种形式保存到硬盘中(保存到本地文件中)

  1. 文件操作

文件操作基本步骤:打开文件 —> 操作文件(读、写)—>关闭文件

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')

补充:

  1. 字典和列表的写操作:先将列表或者字典转换成字符串
with open('stu.txt','w',encoding = 'utf8') as f:
    f.write(str(students))
    
  1. 字典和列表的读操作:将容器式的字符串转换成对应的容器型数据类型(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
  1. 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]

  1. 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()

运行结果如下:
在这里插入图片描述
输入相应序号即可进入相应功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值