Python——文件的基本操作、上下文管理器、pickle序列化和路径处理

本文主要是介绍Python——文件的基本操作、上下文管理器、pickle序列化和路径处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文件的基本操作

Python中打开文件并进行基本操作是一个常见的任务,这包括读取文件内容、写入文件内容、追加内容到文件末尾以及修改文件内容(虽然修改通常涉及读取、修改内容然后重新写入)。以下是这些基本操作的一些基本示例:

打开文件

在Python中,使用内置的open()函数来打开文件。这个函数返回一个文件对象,你可以对这个对象进行读取、写入等操作。open()函数的基本语法是:

file_object = open(file_name, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

其中,file_name是你要打开的文件名(包括路径,如果文件不在当前工作目录下),mode是打开文件的模式(如读'r'、写'w'、追加'a'等),其他参数在大多数情况下可以省略。

读取文件

要以读取模式打开文件,并将文件内容读入到Python中,可以使用open()函数并指定模式为'r'(这是默认模式,也可以省略)。然后,可以使用文件对象的read()readline()readlines()等方法来读取内容。

# 打开文件并读取全部内容  
with open('example.txt', 'r') as file:  content = file.read()  print(content)  # 逐行读取  
with open('example.txt', 'r') as file:  for line in file:  print(line, end='')  # end='' 避免打印额外的换行符

写入文件

要以写入模式打开文件(如果文件已存在,则覆盖原有内容),可以使用模式'w'。然后,可以使用文件对象的write()方法写入内容。

# 写入文件  
with open('output.txt', 'w') as file:  file.write('Hello, Python!\n')  file.write('This is a test file.')

追加内容到文件

要以追加模式打开文件(在文件末尾添加内容,而不是覆盖原有内容),可以使用模式'a'

# 追加内容到文件  
with open('output.txt', 'a') as file:  file.write('\nAdditional line.')

修改文件内容

由于文件在磁盘上是作为连续的数据块存储的,Python(或任何编程语言)没有直接修改文件中间某部分内容的机制。要修改文件内容,你通常需要读取整个文件内容到内存中,修改这部分内容,然后重新写入文件。

# 读取文件内容,修改,然后重新写入  
with open('example.txt', 'r') as file:  lines = file.readlines()  # 修改内容(这里只是示例,实际上你可能需要更复杂的逻辑)  
lines[0] = 'Modified first line\n'  # 写入修改后的内容  
with open('example.txt', 'w') as file:  file.writelines(lines)

注意,在处理文件时,使用with语句是一个好习惯,因为它可以确保文件在使用后会被正确关闭,即使在读取或写入文件时发生异常也是如此。

with语句和上下文管理器

Python的with语句和上下文管理器(Context Managers)是Python中一个非常强大且常用的特性,它们提供了一种简便的方式来封装常用的try...finally模式,特别是在进行文件操作、数据库连接、网络通信等需要资源管理的场景时非常有用。

上下文管理器

上下文管理器是一个实现了__enter__()__exit__()方法的对象。这两个方法允许对象在进入和退出一个代码块时执行自定义的操作,比如设置和清理操作。__enter__()方法在进入代码块之前被调用,其返回值被赋值给with语句中的目标变量(如果有的话)。__exit__()方法在代码块执行完毕后被调用,无论是否发生异常。

使用with语句

with语句的目的是自动管理资源,如文件、线程、网络连接等,以确保这些资源在使用完毕后能够被正确地释放或关闭。它简化了try...finally模式的使用,使得代码更加简洁易读。

示例:文件操作

# 不使用with语句的文件操作  
f = open('example.txt', 'w')  
try:  f.write('Hello, world!')  
finally:  f.close()  # 使用with语句的文件操作  
with open('example.txt', 'w') as f:  f.write('Hello, world!')  
# 文件在with语句块结束时自动关闭

在这个例子中,open()函数返回的文件对象是一个上下文管理器。在with语句块中,文件被自动打开,并在语句块执行完毕后自动关闭,即使发生异常也是如此。

上下文管理器的使用场景

  • 资源管理:如文件操作、数据库连接、网络连接等。
  • 锁定机制:确保代码块在执行过程中,某个资源或数据状态是独占的。
  • 异常处理:自动处理在代码块执行过程中发生的异常。

pickle模块:序列化和反序列化

Python的pickle模块是一个强大的序列化和反序列化工具,它允许你将几乎所有的Python对象结构转换为一个字节流,然后这个字节流可以被保存到文件中,或者通过网络传输到另一个Python程序中,之后再被反序列化回原来的Python对象结构。这个过程分别被称为“pickling”和“unpickling”。

使用场景

  • 数据持久化:将程序中的对象保存到文件中,以便在程序下次运行时能够重新加载这些对象。
  • 对象传输:在网络通信中,将对象序列化为字节流,然后通过网络发送给另一个程序,接收方再将其反序列化回对象。

基本用法

序列化(Pickling)

使用pickle.dump()函数将对象序列化到文件中。

import pickle  data = {'a': [1, 2.0, 3, 4+6j],  'b': ("character string", b"byte string"),  'c': None}  with open('data.pickle', 'wb') as f:  pickle.dump(data, f)

注意,文件需要以二进制写入模式('wb')打开。

反序列化(Unpickling)

使用pickle.load()函数从文件中反序列化对象。

with open('data.pickle', 'rb') as f:  data_loaded = pickle.load(f)  print(data_loaded)

同样,文件需要以二进制读取模式('rb')打开。

安全性

虽然pickle非常强大,但它也带来了安全风险。因为pickle能够加载并执行任意Python代码,所以如果你从不可信的源加载pickle数据,那么你的程序可能会受到攻击。因此,在加载pickle数据时,请确保数据来源是可信的。

替代方案

对于需要序列化和反序列化数据但不需要执行任意代码的场景,可以考虑使用json模块。json模块只能处理Python的基本数据类型(如列表、字典、字符串、整数、浮点数、布尔值和None),但它更安全,因为JSON数据不包含可执行代码。

import json  data = {'a': [1, 2.0, 3, 4+6j],  'b': ("character string",),  'c': None}  # 注意:json不支持复数和字节串的直接序列化  
data_json = {k: (v.real if isinstance(v, complex) else v)  for k, v in data.items() if not isinstance(v, bytes)}  with open('data.json', 'w') as f:  json.dump(data_json, f)  # 读取并打印  
with open('data.json', 'r') as f:  data_loaded = json.load(f)  print(data_loaded)

在这个例子中,我们移除了复数和字节串,因为json不支持这些类型。对于需要这些类型的情况,你可能需要编写自定义的序列化和反序列化函数。

路径处理

在Python中,处理文件路径是一个常见的任务,尤其是当你需要构建、解析或操作文件路径时。Python的ospathlib模块提供了丰富的功能来处理路径。下面是一些使用这两个模块进行路径处理的基本示例。

使用os模块

os模块是Python标准库的一部分,提供了许多与操作系统交互的函数,包括用于路径操作的函数。但是,直接使用os模块进行路径拼接可能会显得有些繁琐,因为你需要考虑不同操作系统之间的路径分隔符差异(Windows使用\,而Unix/Linux/macOS使用/)。

使用pathlib模块

pathlib 是 Python 3.4 版本中引入的一个新的、面向对象的文件系统路径库。它旨在提供比传统的 os.path 模块更加直观和易于使用的 API 来处理文件系统路径。pathlib 通过 Path 类来表示文件系统路径,这个类提供了丰富的方法来执行路径的拼接、分解、遍历、读写文件等操作。

Path 类的基本用法

Path 类是 pathlib 模块的核心,它表示一个文件系统路径。你可以使用它来创建新的路径,或者从字符串转换得到路径。

创建 Path 对象
from pathlib import Path  # 从字符串创建 Path 对象  
p = Path('/usr/bin/python3')  # 也可以直接使用字符串进行运算,但会返回新的 Path 对象  
q = p / 'site-packages'  print(q)  # 输出:/usr/bin/python3/site-packages

注意,/ 运算符在 Path 对象之间被重载,用于路径的拼接。

路径的属性和方法

Path 类提供了许多属性和方法来访问和操作路径。

  • parts:路径的各个组成部分(不包含根目录)作为元组返回。
  • parent:返回路径的父目录。
  • name:返回路径的最后一部分(即文件名或目录名)。
  • suffix:返回文件扩展名(包括点.)。
  • suffixes:返回文件的所有扩展名(从最后一个点开始,包括所有点)。
  • stem:返回文件名,但不包括任何扩展名。
  • anchor:返回路径的“锚”部分,即根目录(在 Unix 上是/,在 Windows 上可能是C:\)。
  • resolve():将路径解析为绝对路径,并规范化。
  • exists():检查路径是否存在。
  • is_dir():检查路径是否是一个目录。
  • is_file():检查路径是否是一个文件。
  • mkdir(parents=False, exist_ok=False):创建新目录。parents=True 会创建所有不存在的父目录,exist_ok=True 会在目录已存在时不抛出异常。
  • rmdir():删除空目录。
  • unlink():删除文件或目录(如果目录为空)。
  • iterdir():迭代路径下的所有条目(文件和目录)。
  • glob(pattern):根据模式匹配路径下的文件或目录。
  • read_text(encoding='utf-8') 和 write_text(data, encoding='utf-8'):读取和写入文本文件。
  • read_bytes() 和 write_bytes(data):读取和写入二进制文件。

示例

以下是一些使用 Path 类的示例:

from pathlib import Path  # 路径是否存在  
p = Path('/usr/bin/python3')  
print(p.exists())  # True 或 False  # 遍历目录  
for item in p.parent.iterdir():  print(item)  # 读取文件内容  
text_file = Path('example.txt')  
if text_file.exists() and text_file.is_file():  content = text_file.read_text()  print(content)  # 写入文件内容  
text_file.write_text('Hello, pathlib!')  # 删除文件  
if text_file.exists():  text_file.unlink()  # 创建新目录  
new_dir = Path('new_directory')  
new_dir.mkdir(parents=True, exist_ok=True)  # 删除空目录  
new_dir.rmdir()

注意事项

  • 在使用 Path 对象的方法时,要注意文件或目录是否存在,以及是否具有相应的读写权限,以避免 FileNotFoundErrorPermissionError 等异常。
  • Path 对象是不可变的,即所有的修改都会返回一个新的 Path 对象,而不会改变原对象。
  • pathlib 是 Python 3.4 及以上版本的推荐方式,但在较旧的 Python 版本中,你可能需要使用 os.path 模块。不过,如果你正在编写新的代码,并且目标是 Python 3.4 或更高版本,那么强烈推荐使用 pathlib

绝对路径和相对路径

在Python中,绝对路径和相对路径是两种用于指定文件或目录位置的方式。它们在不同的场景下各有优势,了解它们之间的区别对于编写可移植和健壮的代码非常重要。

绝对路径

绝对路径是从根目录(或称为顶级目录)开始的完整路径,它包含了到达目标文件或目录所需的所有目录名,中间用路径分隔符(在Windows中是\,在Unix/Linux/macOS中是/)分隔。绝对路径是唯一的,不依赖于当前工作目录。

示例

  • 在Windows上:C:\Users\YourName\Documents\file.txt
  • 在Unix/Linux/macOS上:/home/yourname/documents/file.txt

相对路径

相对路径是从当前工作目录(Current Working Directory, CWD)开始的路径。它不包含从根目录到目标文件或目录的完整路径,而是仅包含从当前目录到目标文件或目录的相对位置。相对路径依赖于当前工作目录,因此如果当前工作目录改变,相同的相对路径可能会指向不同的文件或目录。

示例

假设当前工作目录是/home/yourname/documents,那么相对路径file.txt将指向/home/yourname/documents/file.txt

如果当前工作目录改变为/home/yourname/projects,那么相同的相对路径file.txt将尝试访问/home/yourname/projects/file.txt,这可能会失败,除非在该位置确实存在一个名为file.txt的文件。

在Python中使用绝对路径和相对路径

在Python中,你可以直接使用字符串来表示路径(无论是绝对路径还是相对路径),并将其传递给需要文件路径的函数或方法。此外,Python的pathlib模块提供了许多有用的函数和类来帮助你处理路径。

from pathlib import Path  # 绝对路径  
absolute_path = Path('/home/yourname/documents/file.txt')  # 相对路径(假设当前工作目录是/home/yourname/documents)  
relative_path = Path('file.txt')  # 读取文件(使用绝对路径)  
content = absolute_path.read_text()  # 更改当前工作目录(注意:pathlib本身不直接提供更改当前工作目录的功能,这里仅作为说明)  
# 但你可以使用Path的resolve()方法来获取绝对路径,这不受当前工作目录的影响  # 使用相对路径(pathlib会自动处理当前工作目录)  
# 但请注意,Path对象本身不直接“知道”当前工作目录,除非你在代码中显式地设置了它  
# 例如,通过os.chdir()改变工作目录,然后使用Path对象进行相对路径操作

这篇关于Python——文件的基本操作、上下文管理器、pickle序列化和路径处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1112134

相关文章

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

Python操作PDF文档的主流库使用指南

《Python操作PDF文档的主流库使用指南》PDF因其跨平台、格式固定的特性成为文档交换的标准,然而,由于其复杂的内部结构,程序化操作PDF一直是个挑战,本文主要为大家整理了Python操作PD... 目录一、 基础操作1.PyPDF2 (及其继任者 pypdf)2.PyMuPDF / fitz3.Fre

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统