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

文章目录


前言

前文模块中提到加密模块,本文将终点介绍加密模块和文件流。


一.文件流和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字符串

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

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北 染 星 辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值