【100天精通python】Day26:文件和IO操作_文件指针的定位与移动,序列化与反序列化

news2024/9/24 23:28:25

目录

专栏导读 

1 文件的基本操作 

1.1 参考

1.2 获取文件属性:

2  定位和移动文件指针

3 序列化和反序列化 

3.1 序列化与反序列化概述

3.2JSON序列化与反序列化

 JSON序列化:

 JSON反序列化:

 3.3 pickle 序列化与反序列化

 pickle 序列化:

 pickle 反序列化:

4 总结


专栏导读 

专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12375510.html


1 文件的基本操作 

1.1 参考

【100天精通python】Day19:文件及目录操作_基本文件操作

http://t.csdn.cn/oEcD0

【100天精通python】Day21:文件及目录操作_文件的权限处理和批量处理http://t.csdn.cn/5NNpm

1.2 获取文件属性:

        可以使用 ​os.stat()​ 函数来获取文件的各种属性,如大小、创建时间、修改时间等。以下是一个示例:

import os

file_path = "path/to/file.txt"
file_stat = os.stat(file_path)

print("文件大小:", file_stat.st_size)
print("创建时间:", file_stat.st_ctime)
print("修改时间:", file_stat.st_mtime)
print("访问时间:", file_stat.st_atime)

2  定位和移动文件指针

        文件指针(file pointer)是用来标记文件中当前位置的一个概念性的指针。它指示了下一次读写操作将在文件中发生的位置。

        文件指针可以看作是一个指向文件中某个位置的指针,类似于数学中的游标。在读取文件时,文件指针指示了将要读取的数据的起始位置;在写入文件时,文件指针指示了将要写入的数据的位置,并且会随着数据的写入自动移动到下一个写入位置。

        每个打开的文件都有一个对应的文件指针,该指针初始时位于文件的起始位置。文件指针的位置可以通过文件操作来修改,通常使用 tell()和​seek()​ 函数来进行定位和移动。

2.1 tell() 函数使用

        ​tell()​方法是用于获取当前文件指针的位置(即文件读写的位置)的。在Python中,文件对象有一个文件指针,它标识了当前读写的位置。初始时,文件指针位于文件开头。当我们进行读取或写入操作后,文件指针会随之移动到相应的位置。

​  tell()​方法返回的是一个整数,表示当前文件指针的位置。该位置是相对于文件开头的偏移量,以字节为单位。

下面是一个简单的示例,展示如何使用 ​tell()​方法获取当前文件指针的位置:

# 打开文件
file = open("example.txt", "r")

# 读取文件内容
content = file.read(10)  # 读取10个字符

# 获取当前文件指针的位置
position = file.tell()
print("当前文件指针位置:", position)

# 关闭文件
file.close()

请注意,在读写文件的过程中,每次读写都会导致文件指针的移动,所以在需要获取指针位置时,应在读写操作之后调用 ​tell()​方法来获取最新的位置。

​2.2 seek()​ 函数使用

过调用 ​seek()​ 函数并传递要移动的字节数或字符数以及相对于哪个参考点进行移动,可以改变文件指针的位置。

以下是一些常见的文件指针移动操作:

  • ​seek(0)​:将文件指针移动到文件开头。
  • ​seek(0, 2)​:将文件指针移动到文件末尾。
  • ​seek(offset, 0)​:以文件开头为参考点,将文件指针向后移动 ​offset​ 个字节或字符。
  • ​seek(offset, 1)​:以当前文件指针位置为参考点,将文件指针向后或向前移动 ​offset​ 个字节或字符。
  • ​seek(offset, 2)​:以文件末尾为参考点,将文件指针向前移动 ​offset​ 个字节或字符。

文件指针的位置对于文件的读取和写入操作非常重要,因为它决定了在何处进行数据的读取和写入。通过操作文件指针,可以选择性地读取或写入文件中的特定位置的数据,使文件操作更加灵活和精确。

以下是一些​seek()常用语法:

 1. 将文件指针移动到文件开头:

file.seek(0)

2. 将文件指针移动到文件末尾:

file.seek(0, 2)

3 .将文件指针相对于当前位置向后移动:

file.seek(5, 1)

4. 将文件指针相对于文件末尾向前移动:

file.seek(-10, 2)

       需要注意的是,在使用 ​seek()​方法之前,文件必须以可读或可写模式打开。另外,在进行文件指针移动时,要注意边界条件和文件的大小,避免超出文件的范围。

3 序列化和反序列化 

3.1 序列化与反序列化概述

        序列化和反序列化是计算机编程中的重要概念,用于将数据转换为可存储或传输的格式,以及将这些格式转换回原始数据。这两个概念在数据的持久化(存储在硬盘或数据库中)和数据的网络传输(例如通过网络发送数据)等方面非常常见。

  1. 序列化(Serialization): 序列化是将数据结构或对象转换为一种可持久化或可传输的格式,例如字节流、JSON字符串、XML等。序列化后的数据可以存储在文件中、通过网络传输,或在内存中进行缓存。序列化的目的是为了将数据在不同系统之间进行交换或保存,使得数据可以被传输、存储和重新构建。

  2. 反序列化(Deserialization): 反序列化是将序列化后的数据重新转换回原始的数据结构或对象的过程。通过反序列化,我们可以从持久化的数据或传输的数据中重新构建出原始的数据结构,使得我们可以继续操作和使用这些数据。

        序列化和反序列化在各种编程场景中都非常常见。例如,当我们需要将对象保存到文件系统中,以便在程序重启后恢复状态时,我们会使用序列化操作。又或者当我们需要将数据通过网络发送给其他系统时,我们会将数据序列化为特定格式,发送后对方再进行反序列化以还原数据。

        在不同的编程语言中,通常都有相应的序列化和反序列化的支持,以及对应的库或模块用于处理这些操作。常见的序列化格式包括 JSON、XML、YAML 和 Pickle(Python 特有的序列化格式)。选择适当的序列化格式取决于应用的需求和场景。需要注意的是,对于反序列化操作,务必确保从可信源加载数据,以避免安全漏洞。

3.2JSON序列化与反序列化

        JSON序列化和反序列化是将数据转换为JSON格式以便于存储和传输,并将JSON格式数据还原为原始数据结构的过程。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写。在Python中,可以使用json模块进行JSON序列化和反序列化操作。

 JSON序列化:

示例: 假设我们有一个Python字典,我们要将其序列化为JSON字符串:

import json

data = {
    "name": "John",
    "age": 30,
    "is_student": False,
    "hobbies": ["reading", "gaming", "coding"]
}

# 将Python对象序列化为JSON字符串
json_string = json.dumps(data)
print(json_string)

输出

{"name": "John", "age": 30, "is_student": false, "hobbies": ["reading", "gaming", "coding"]}
 JSON反序列化:

示例: 假设我们有一个JSON字符串,我们要将其反序列化为Python对象:

import json

json_string = '{"name": "John", "age": 30, "is_student": false, "hobbies": ["reading", "gaming", "coding"]}'
# 将JSON字符串反序列化为Python对象
data = json.loads(json_string)
print(data)

输出

{'name': 'John', 'age': 30, 'is_student': False, 'hobbies': ['reading', 'gaming', 'coding']}

        在JSON序列化时,json.dumps()函数将Python对象转换为JSON格式的字符串。在JSON反序列化时,json.loads()函数将JSON字符串转换回原始的Python数据结构。

        需要注意的是,JSON只支持有限的数据类型,包括字符串、数值、布尔值、列表、字典和None。当将Python对象序列化为JSON时,确保对象的数据类型是JSON兼容的。例如,Python的布尔值True和False将分别被序列化为JSON中的true和false。在反序列化时,JSON字符串将被还原为Python中相应的数据类型。

        总结:JSON序列化和反序列化是在Python中处理数据以便于存储和传输的重要工具。JSON是一种通用的数据交换格式,适用于跨语言通信。在Python中,使用json模块可以很方便地进行JSON序列化和反序列化操作。

 3.3 pickle 序列化与反序列化

    pickle 是 Python 内置的模块,用于将 Python 对象序列化为字节流,并将字节流反序列化回 Python 对象。反序列化操作是将序列化后的数据重新转换回Python对象的过程。与 JSON 不同,pickle 可以序列化几乎所有 Python 数据类型,包括自定义类的实例。

 pickle 序列化:

        示例: 假设我们有一个 Python 字典,我们将其序列化为字节流:

import pickle

data = {
    "name": "John",
    "age": 30,
    "is_student": False,
    "hobbies": ["reading", "gaming", "coding"]
}

# 将 Python 对象序列化为字节流
serialized_data = pickle.dumps(data)
print(serialized_data)
 pickle 反序列化:

        示例: 假设我们有一个 pickle 序列化后的字节流,我们将其反序列化为 Python 对象:

import pickle

# 假设这是 pickle 序列化后的字节流
serialized_data = b'\x80\x04\x95)\x00\x00\x00\x00\x00\x00\x00}\x94\x8c\x04John\x94\x8c\x03age\x94K\x1e\x8c\nis_student\x94\x89\x88\x8c\x07hobbies\x94]\x94(\x8c\x07reading\x94\x8c\x06gaming\x94\x8c\x06coding\x94eu.'

# 将 pickle 序列化后的字节流反序列化为 Python 对象
data = pickle.loads(serialized_data)
print(data)

输出:

{'name': 'John', 'age': 30, 'is_student': False, 'hobbies': ['reading', 'gaming', 'coding']}

pickle 提供了 dumps()loads() 函数用于序列化和反序列化操作。dumps() 函数将 Python 对象序列化为字节流,而 loads() 函数将字节流反序列化为原始 Python 对象。

注意:pickle 序列化的数据是二进制形式的,不可读,适用于 Python 内部使用。可以保存和加载Python特定的数据结构和对象。同时要注意在反序列化时,尽量不要处理来自不可信源的数据,以避免安全漏洞。如果需要跨语言传输数据,JSON 序列化通常是更好的选择。

4 总结

        json模块序列化的数据是纯文本形式,可读性较好,适合跨语言传输。而pickle模块序列化的数据是二进制形式,不可读,适用于Python内部使用。

        在反序列化操作中,我们需要确保从可信的来源加载数据,以避免安全问题。尤其是在使用pickle模块时,只有您自己或您信任的来源创建的pickle文件应该被反序列化。pickle对于不可信数据是不安全的,因为它可以执行任意代码。相比之下,JSON是一个安全的序列化格式,它只表示数据,不包含可执行代码。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/854456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CTF REVERSE练习之病毒分析

首先介绍两个知识点,在后面的实验中运用到的。 1、7Zip 7-Zip 是一款开源软件。我们可以在任何一台计算机上使用 7-Zip ,包括用在商业用途的计算机。7-Zip 适用于 Windows 7 / Vista / XP / 2008 / 2003 / 2000 / NT / ME / 98。并且有面向 Mac OS X、…

开发中常用的数据库日志都长啥样呢?

目录 常见日志级别 数据库日志 Undo log 逻辑日志 redolog binlog 慢查询日志 AOF 文本文件 RDB 二进制文件 常见日志级别 DEBUG:用于详细记录应用程序的运行过程,如变量值、执行流程等。DEBUG级别的日志通常用于开发和调试过程中,以…

不看后悔一辈子!不看错过50K!历尽心血总结Redis全局命令

前言: 📕作者简介:热爱编程的敖云岚,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年! 📘相关专栏:Java基础语法,JavaEE初阶,数据库&#xff0c…

【Python】单元测试框架unitest及其高级应用

目录 Unittest 简单使用示例 重要概念 断言方法 深入 高级应用 认识Page Object 资料获取方法 Unittest Unittest是python的一个单元测试框架,但是它不仅适用于单元测试,还适用自动化测试用例的开发与执行。我们可以很方便的使用它组织执行测试用…

JVM垃圾回收篇-垃圾回收算法

JVM垃圾回收篇-垃圾回收算法 标记清除(Mark Sweep) 概念 collector指的就是垃圾收集器。 mutator是指除了垃圾收集器之外的部分,比如说我们的应用程序本身。 mutator的职责一般是NEW(分配内存)、READ(从内存中读取内容)、WRITE(将内容写入内…

CSMA/CD协议原理

共享总线以太网具有天然的广播特性,即使总线上某个站点给另一个站点发送单播帧,表示帧的信号也会沿着总线传播到总线上的其他各站点 。 当某个站点在总线上发送顿时,此时,如果总线上的其他站点也要在总线当某个站点在总线上发送顿…

Qt应用开发(基础篇)——时间微调输入框 QDateTimeEdit、QDateEdit、QTimeEdit

一、前言 QAbstractSpinBox是全部微调输入框的父类,这是一种允许用户通过点击上下箭头按钮或输入数字来调整数值的图形用户界面控件,父类提供了当前值text、对齐方式align、只读readOnly等通用属性和方法。在上一篇数值微调输入框中有详细介绍。 QDateTi…

资深java程序员的IDEA的常用设置

设置入口 打开项目以后也可以在左上角File-->setting进行设置,不过部分设置的是该项目的,换个项目可能就变了,建议打开项目之前就设置。 一般新的idea软件默认是下图页面,或者打开项目后可以点击File-->Close Project退到…

【CI/CD】Git Flow 分支模型

Git Flow 分支模型 1.前言 Git Flow 模型(本文所阐述的分支模型)构思于 2010 年,也就是 Git 诞生后不久,距今已有 10 多年。在这 10 多年中,Git Flow 在许多软件团队中大受欢迎。 在这 10 多年里,Git 本身…

C++异常使用

异常关键字: try:在try部可检测异常 catch:当发现异常捕获处 throw:抛出异常处 noexcept:被修饰函数内部不会发生异常 允许抛出和捕捉各种类型的数据。 int main() {try{func();}catch(const char*e){ //捕捉字符…

计算机是怎么存储和识别人类高级语言的

目录 1、计算机是怎么“存储”人类的高级语言的?2、 UTF-8和UTF-32的区别3、UTF-8是如何区分字节的长度呢?(即如何识别这一串二进制是多少个字节的?)4、计算机是如何识别人类的高级语言的? 1、计算机是怎么…

idea如何开启多个客户端(一个代码开启多个客户端运行)

1.在编程界面UdpEchoClient的下拉列表中找到Edit Configurations...并点击 2.点击Modify options 3.点击Allow multiple instances将其勾选上 4.点击ok 在经历了以上的设置以后,再次运行客户端的程序便会创建一个新的客户端运行(有了一个新的运行窗口&am…

【AI】《动手学-深度学习-PyTorch版》笔记(十四):多层感知机

AI学习目录汇总 1、多层感知机网络结构 1.1 线性模型:softmax回归 在前面介绍过,使用softmax回归来处理分类问题时,每个输出通过都一个仿射函数计算,网络结构如下,输入和输出之间为全链接层: 1.2 多层感知机 多层感知机就是在输入和输出中间再添加一个或多个全链接…

解数独(Java)

题目链接: 力扣 题目详情: 37. 解数独t编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只…

研发工程师玩转Kubernetes——使用emptyDir在同一Pod不同容器间共享数据

kubernets可以通过emptyDir实现在同一Pod的不同容器间共享文件系统。 正如它的名字,当Pod被创建时,emptyDir卷会被创建,这个时候它是一个空的文件夹;当Pod被删除时,emptyDir卷也会被永久删除。 同一Pod上不同容器之间…

【数据分析】pandas (三)

基本功能 在这里,我们将讨论pandas数据结构中常见的许多基本功能 让我们创建一些示例对象: index pd.date_range(“1/1/2000”, periods8) s pd.Series(np.random.randn(5), index[“a”, “b”, “c”, “d”, “e”]). df pd.DataFrame(np.random.…

BDA初级分析——界定问题

数据分析,从界定问题开始 一、界定问题的作用 如何从现有台式机企业客户中挑选出那些想购买服务器的企业客户? 问题中的陷阱,隐藏的假设条件 假设1: 在购买服务器的客户中,只有0.01%的客户是购买过公司台式机的客户&#xff0…

超详细的Linux基础命令

文章目录 前言Linux目录结构Linux命令通用格式ls 命令什么是工作目录什么是 HOME 目录 目录切换相关命令cd 命令pwd 命令 特殊的路径符创建目录文件操作相关命令touch 命令cat 命令more 命令cp 命令mv 命令rm 命令通配符 查找命令which 命令find 命令按文件名查找文件按文件大小…

无人驾驶实战-第十一课(控制理论)

在七月算法上报了《无人驾驶实战》课程,老师讲的真好。好记性不如烂笔头,记录一下学习内容。 课程入口,感兴趣的也可以跟着学一下。 ————————————————————————————————————————— 无人驾驶中控制系…