文章目录
-
目录
文章目录
前言
一.文件流和IO流概述
二.文件流操作方法
打开文件流:open()
读取文件流:read()
关闭文件流:close()/with
文件流编码:encoding()
复制函数:copy()
三. 序列化
Json模块
Packle模块
前言
前文模块中提到加密模块,本文将终点介绍加密模块和文件流。
一.文件流和IO流概述
在Python中,IO流是用于输入和输出数据的通道。它可以用于读取输入数据或将数据写入输出目标。IO流可以是标准输入/输出流(stdin和stdout),也可以是文件流,网络流等。
文件流是一种特殊类型的IO流,用于读取和写入文件。文件流可以打开文件,并允许我们通过读取和写入操作来访问文件的内容。Python提供了许多内置函数和模块来处理文件流。
二.文件流操作方法
打开文件流:open()
要打开文件流,可以使用内置的open()函数。open()函数接受文件名和访问模式作为参数,并返回一个文件对象。访问模式可以是读取模式('r'),写入模式('w');读取字符数据(' t '),读取字节数据(' b '),追加模式('a')。
演示案例:覆盖123.txt文件中内容并写入"456"
file = open("123.txt","wt")
file.write("456")注:write模式会覆盖原文件内容再写入若文件不存在,open函数会自动创建
演示案例2:在123.txt文件中追加内容"456"
file = open("123.txt","at")
file.write("123")
读取文件流:read()
读取文件流可以使用文件对象的read()或readline()方法。read()方法将读取整个文件的内容,而readline()方法将读取文件的一行。
file = open("123.txt","rt")
print(file.read())
演示案例:读取文件数据同时计算该文件哈希值
file = open("123.txt","rb")from hashlib import *
#创建空md5对象存储每次读取的1024字节数据
md5 = md5()
while True:#每次从文件中读取1024字节用于校验content = file.read(1024)#当读取的字节数据是空,说明文件已读完,此时结束循环if content == b"":break#每次读取数据后存储到空的md5对象中md5.update(content)
#当读物完毕跳出循环后,计算哈希值
print(md5.hexdigest())
关闭文件流:close()/with
- 使用
close()
方法关闭文件流。这是最常见的方法,可以在文件操作完成后调用close()
方法来关闭文件流。
file = open("example.txt", "r")
# 文件操作
file.close()
- 使用
with
语句自动关闭文件流。with
语句可以在文件操作完成后自动关闭文件流,无需手动调用close()
方法。
with open("example.txt", "r") as file:# 文件操作pass
文件流编码:encoding()
file = open("123.txt","rb")
file = open("example.txt", "r",encoding="utf-8")
# 文件操作
file.close()
复制函数:copy()
import shutildef copy_file(source, destination):with open(source, 'rb') as src_file:with open(destination, 'wb') as dest_file:shutil.copyfileobj(src_file, dest_file)print("文件流复制完成")source_file = "source.txt"
destination_file = "destination.txt"copy_file(source_file, destination_file)
复制
插入
三. 序列化
在Python中,序列化是指将对象转化为字节流的过程。这样做的好处是可以将对象保存到磁盘上或通过网络传输。反之,将字节流转化为对象的过程则称为反序列化。
Json模块
Json模块提供了一些功能来处理JSON数据,包括将Python对象转换为JSON字符串(编码)、将JSON字符串转换为Python对象(解码)、格式化输出JSON数据等。
json.dumps(): 将Python对象转换为JSON字符串
json.dump(): 将Python对象以JSON格式写入文件。
import json
data = {'name': 'John','age': 30,'city': 'New York'}
json_data = json.dumps(data)
print(json_data)输出:
{"name": "John", "age": 30, "city": "New York"}
在上面的示例中,我们定义了一个字典data
,然后使用json.dumps()
函数将该字典转换为一个JSON格式的字符串json_data
。然后,我们打印出这个JSON字符串。
json.loads(): 将JSON字符串转换为Python对象
json.load(): 从文件中读取JSON数据,并将其转换为Python对象。
import json # 假设我们有一个JSON格式的字符串
json_str = '{"name": "John Doe", "age": 30, "is_employee": true}' # 使用json.loads()将JSON字符串解码成Python对象
python_obj = json.loads(json_str) # 现在python_obj是一个Python字典
print(python_obj)输出:
{'name': 'John Doe', 'age': 30, 'is_employee': True}
Packle模块
- JSON:JSON是一种文本序列化格式,它输出Unicode文本(尽管在大多数情况下,它会被编码为UTF-8)。JSON格式的数据易于人阅读和编写,同时也易于机器解析和生成。
- pickle:pickle是Python特有的一个二进制序列化格式。它可以将Python对象转换为字节流,以便在不同的程序之间传输和保存。
四.登录界面案例
import json
import time
from hashlib import *#账户/密码注册函数
def SetAccount():new_account = input("请输入注册账户:")new_passwd = input("请输入新密码:")new_passwd_confirm = input("请再次输入新密码:")if new_passwd == new_passwd_confirm:with open("account_pwd.txt", "rt") as file:old_account = json.loads(file.read())if new_account in old_account:print("账户已存在")else:#哈希运算新注册密码hash_new_passwd = md5(new_passwd.encode()).hexdigest()#将新注册账户/密码作为键值追加到保存账户密码的字典中old_account[f"{new_account}"] = f"{hash_new_passwd}"with open("account_pwd.txt", "wt") as file1:#将添加新注册账号的字典重新写入保存账号密码的文件中json.dump(old_account, file1)print("注册成功,即将跳转登录页面...")time.sleep(1)login()else:print("两次输入的密码不一致,请重新输入")SetAccount()
#登录函数
def login():account = input("请输入登录账号:")passwd = input("请输入登录密码:")#登录密码进行哈希运算hash_passwd = md5(passwd.encode()).hexdigest()with open("account_pwd.txt","rt") as file:data = json.loads(file.read())#判断登录密码哈希值和文件中保存的密码哈希值是否一致if account in data and data[account] == hash_passwd:print("登录成功")else:print("账号或密码错误!!!")num = int(input("请选择登录/注册(1:登录 2:注册):"))
if num == 1:login()
else:SetAccount()