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

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

专栏导读

专栏订阅地址: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是一个安全的序列化格式,它只表示数据,不包含可执行代码。  


目录
打赏
0
0
0
0
20
分享
相关文章
解锁文件共享软件背后基于 Python 的二叉搜索树算法密码
文件共享软件在数字化时代扮演着连接全球用户、促进知识与数据交流的重要角色。二叉搜索树作为一种高效的数据结构,通过有序存储和快速检索文件,极大提升了文件共享平台的性能。它依据文件名或时间戳等关键属性排序,支持高效插入、删除和查找操作,显著优化用户体验。本文还展示了用Python实现的简单二叉搜索树代码,帮助理解其工作原理,并展望了该算法在分布式计算和机器学习领域的未来应用前景。
|
19天前
|
使用Python实现multipart/form-data文件接收的http服务器
至此,使用Python实现一个可以接收 'multipart/form-data' 文件的HTTP服务器的步骤就讲解完毕了。希望通过我的讲解,你可以更好地理解其中的逻辑,另外,你也可以尝试在实际项目中运用这方面的知识。
120 69
探秘文件共享服务之哈希表助力 Python 算法实现
在数字化时代,文件共享服务不可或缺。哈希表(散列表)通过键值对存储数据,利用哈希函数将键映射到特定位置,极大提升文件上传、下载和搜索效率。例如,在大型文件共享平台中,文件名等信息作为键,物理地址作为值存入哈希表,用户检索时快速定位文件,减少遍历时间。此外,哈希表还用于文件一致性校验,确保传输文件未被篡改。以Python代码示例展示基于哈希表的文件索引实现,模拟文件共享服务的文件索引构建与检索功能。哈希表及其分布式变体如一致性哈希算法,保障文件均匀分布和负载均衡,持续优化文件共享服务性能。
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
122 34
Python 高级编程与实战:深入理解网络编程与异步IO
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧、数据科学、机器学习、Web 开发和 API 设计。本文将深入探讨 Python 在网络编程和异步IO中的应用,并通过实战项目帮助你掌握这些技术。
Python中的Paramiko与FTP文件夹及文件检测技巧
通过使用 Paramiko 和 FTP 库,开发者可以方便地检测远程服务器上的文件和文件夹是否存在。Paramiko 提供了通过 SSH 协议进行远程文件管理的能力,而 `ftplib` 则提供了通过 FTP 协议进行文件传输和管理的功能。通过理解和应用这些工具,您可以更加高效地管理和监控远程服务器上的文件系统。
83 20
如何在Python中高效地读写大型文件?
大家好,我是V哥。上一篇介绍了Python文件读写操作,今天聊聊如何高效处理大型文件。主要方法包括:逐行读取、分块读取、内存映射(mmap)、pandas分块处理CSV、numpy处理二进制文件、itertools迭代处理及linecache逐行读取。这些方法能有效节省内存,提升效率。关注威哥爱编程,学习更多Python技巧。
119 8
如何使用 Python 进行文件读写操作?
大家好,我是V哥。本文介绍Python中文件读写操作的方法,包括文件读取、写入、追加、二进制模式、JSON、CSV和Pandas模块的使用,以及对象序列化与反序列化。通过这些方法,你可以根据不同的文件类型和需求,灵活选择合适的方式进行操作。希望对正在学习Python的小伙伴们有所帮助。欢迎关注威哥爱编程,全栈路上我们并肩前行。
102 4
剖析文件共享工具背后的Python哈希表算法奥秘
在数字化时代,文件共享工具不可或缺。哈希表算法通过将文件名或哈希值映射到存储位置,实现快速检索与高效管理。Python中的哈希表可用于创建简易文件索引,支持快速插入和查找文件路径。哈希表不仅提升了文件定位速度,还优化了存储管理和多节点数据一致性,确保文件共享工具高效运行,满足多用户并发需求,推动文件共享领域向更高效、便捷的方向发展。
如何使用Python将TS文件转换为MP4
本文介绍了如何使用Python和FFmpeg将TS文件转换为MP4文件。首先需要安装Python和FFmpeg,然后通过`subprocess`模块调用FFmpeg命令,实现文件格式的转换。代码示例展示了具体的操作步骤,包括检查文件存在性、构建FFmpeg命令和执行转换过程。
120 7

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等