欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > Python---文件IO流及对象序列化

Python---文件IO流及对象序列化

2024/10/24 20:13:26 来源:https://blog.csdn.net/zhoutong2323/article/details/141999676  浏览:    关键词:Python---文件IO流及对象序列化

文章目录

  • 目录

    文章目录

    前言

    一.文件流和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()

总结

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com