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 MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

Python xmltodict实现简化XML数据处理

《Pythonxmltodict实现简化XML数据处理》Python社区为提供了xmltodict库,它专为简化XML与Python数据结构的转换而设计,本文主要来为大家介绍一下如何使用xmltod... 目录一、引言二、XMLtodict介绍设计理念适用场景三、功能参数与属性1、parse函数2、unpa

Python中使用defaultdict和Counter的方法

《Python中使用defaultdict和Counter的方法》本文深入探讨了Python中的两个强大工具——defaultdict和Counter,并详细介绍了它们的工作原理、应用场景以及在实际编... 目录引言defaultdict的深入应用什么是defaultdictdefaultdict的工作原理

Python中@classmethod和@staticmethod的区别

《Python中@classmethod和@staticmethod的区别》本文主要介绍了Python中@classmethod和@staticmethod的区别,文中通过示例代码介绍的非常详细,对大... 目录1.@classmethod2.@staticmethod3.例子1.@classmethod

Python手搓邮件发送客户端

《Python手搓邮件发送客户端》这篇文章主要为大家详细介绍了如何使用Python手搓邮件发送客户端,支持发送邮件,附件,定时发送以及个性化邮件正文,感兴趣的可以了解下... 目录1. 简介2.主要功能2.1.邮件发送功能2.2.个性签名功能2.3.定时发送功能2. 4.附件管理2.5.配置加载功能2.6.

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写