文章目录
前言
前文模块中提到加密模块,本文将终点介绍加密模块和文件流。
一.文件流和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 shutil
def 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 格式的字符串。
- 它的返回值是一个字符串,可以直接打印或存储在变量中。
- 适用于将 Python 对象转换为 JSON 字符串后进行进一步处理,如网络传输、字符串拼接等。
json.dump():
- 该方法将 Python 对象转换为 JSON 格式,并将其写入到一个文件对象中。
- 它没有返回值,主要用于将 JSON 数据直接保存到文件中。
- 适用于需要将 JSON 数据持久化存储到文件的场景。
反序列化函数
json.load()
:
- 该方法用于从文件对象中读取 JSON 数据,并将其转换为 Python 对象(如:字典,列表)。它的参数是一个已经打开的文件对象,通常用于处理存储在文件中的 JSON 数据。
json.loads()
:
- 该方法用于将一个 JSON 格式的字符串转换为 Python 对象。它的参数是一个字符串,适用于处理已经获取到的 JSON 字符串数据,比如从网络请求中获取的 JSON 响应。
下面通过两个案例对比进一步说明JSON模块的作用:
案例一:
list = [1,2,3]
with open("文件IO流.txt","wt") as file:
file.write(f"{list}")
print("未写入文件前list数据类型为:",type(list))
with open("文件IO流.txt","rt") as file:
data = file.read()
print("文件中读取的列表数据类型为:",type(data))
写入文件时:
file.write()
方法要求传入的参数是字符串类型。所以代码里使用了f-string
(f"{list}"
)把列表list
转换为字符串。- 当执行
file.write(f"{list}")
时,列表[1, 2, 3]
会被转换为字符串"[1, 2, 3]"
后写入文件。文件里存储的是这个字符串,而不是原来的列表对象。
从文件中读取内容时:
file.read()
方法从文件里读取内容,不管文件里原本是什么数据,读取出来的都是字符串。因为文件存储的是之前转换后的字符串"[1, 2, 3]"
,所以data
得到的就是这个字符串。- 因此,
type(data)
输出为<class 'str'>
,显示从文件读取的数据类型是字符串,而不是列表。
案例二:
import json
list = [1,2,3]
with open("文件IO流.txt","wt") as file:
file.write(f"{json.dumps(list)}")
print("未写入文件前list数据类型为:",type(list))
with open("文件IO流.txt","rt") as file:
content = file.read()
print("文件中读取的列表数据类型为:",type(json.loads(content)))
打开文件并写入JSON数据:
with open("文件IO流.txt", "wt") as file:
:使用with
语句以文本写入模式("wt"
)打开名为"文件IO流.txt"
的文件。"w"
表示写入模式,如果文件不存在则创建,如果文件已存在则会清空原有内容;"t"
表示文本模式。with
语句会自动管理文件的打开和关闭,确保在代码块执行完毕后文件被正确关闭。file.write(f"{json.dumps(list)}")
:json.dumps(list)
会将列表list
转换为 JSON 格式的字符串,这里使用 f - 字符串只是一种形式,其实直接file.write(json.dumps(list))
效果相同。然后使用file.write()
方法将该 JSON 字符串写入文件。print("未写入文件前list数据类型为:", type(list))
:打印未写入文件前list
的数据类型,输出结果为<class 'list'>
,表明list
是一个列表对象。
打开文件并读取JSON数据:
with open("文件IO流.txt", "rt") as file:
:使用with
语句以文本读取模式("rt"
)打开名为"文件IO流.txt"
的文件。"r"
表示读取模式,如果文件不存在会抛出FileNotFoundError
异常;"t"
表示文本模式。content = file.read()
:使用read()
方法读取文件的全部内容,并将其存储在变量content
中,此时content
是一个包含 JSON 数据的字符串。print("文件中读取的列表数据类型为:", type(json.loads(content)))
:json.loads(content)
会将 JSON 字符串content
转换为对应的 Python 对象,这里由于最初存储的是列表,所以转换后也是列表。然后打印该对象的数据类型,输出结果为<class 'list'>
JSON模块的优势
- 几乎所有编程语言都支持 JSON 的解析和生成。因此,当不同编程语言编写的系统之间需要交换数据时,JSON 成为了理想的选择。例如,在一个 Web 应用中,前端使用 JavaScript 发送 JSON 格式的数据,后端使用 Python 接收。
- Python 的
JSON
模块可以方便地将 Python 对象(如字典、列表)转换为 JSON 字符串进行发送,也能将接收到的 JSON 字符串转换为 Python 对象进行处理。
json.dump和json.load函数的用法:
with open('data.json', 'w', encoding='utf-8') as file:
# 将 Python 字典以 JSON 格式写入文件,设置缩进为 4 个空格
json.dump(data, file)
with open('data.json', 'r', encoding='utf-8') as file:
# 从文件中读取 JSON 数据并转换为 Python 对象
loaded_data = json.load(file)
案例:
import json
my_list = [1,2,3]
with open("文件IO流.txt","wt") as file:
json.dump(my_list,file)
print("未写入文件前list数据类型为:",type(my_list))
with open("文件IO流.txt","rt") as file:
content = json.load(file)
print("文件中读取的列表数据类型为:",type(content))
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()