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 格式的字符串。
  • 它的返回值是一个字符串,可以直接打印或存储在变量中。
  • 适用于将 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()

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

北 染 星 辰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值