写点什么

Python 文件操作指南:读写、异常处理与上下文管理器详解

作者:申公豹
  • 2023-12-24
    内蒙古
  • 本文字数:3734 字

    阅读完需:约 12 分钟

文件读写和字符编码在 Python 中的实现

一、I/O 操作概述

I/O(Input/Output)在计算机中指的是数据的输入和输出,涉及数据在内存和外部设备(如磁盘、网络)之间的流动。输入流(Input Stream)表示数据从外部流向内存,而输出流(Output Stream)表示数据从内存流向外部。在程序运行时,数据通常存储在内存中,由 CPU 执行操作。然而,涉及到与外部设备(通常是磁盘或网络)进行数据交换的地方,就需要使用 I/O 接口。


操作系统是一个通用的软件程序,提供了许多功能,包括硬件驱动、进程管理、内存管理、网络管理、安全管理以及 I/O 管理。操作系统屏蔽了底层硬件,向上提供通用接口。因此,I/O 的能力由操作系统提供,而高级编程语言将操作系统提供的底层接口封装起来,供开发者使用。Python 也不例外。

二、文件读写实现原理与操作步骤

1. 文件读写实现原理

文件读写是一种常见的 I/O 操作。Python 等高级编程语言封装了底层的操作系统接口,直接提供了文件读写的相关方法。通常,文件读写的对象是文件描述符(file descriptor),它是通过请求操作系统打开一个文件(通常称为文件路径)获得的。Python 中使用 open() 函数获取文件对象。

2. 文件读写操作步骤

文件读写的步骤在不同编程语言中大致相同:


  1. 打开文件,获取文件描述符: 使用内置函数(如 Python 的 open())传递文件路径和打开模式等参数,获取文件对象的文件描述符。

  2. 操作文件描述符(读/写): 通过文件描述符进行读写操作,可以使用不同的方法和模式来满足需求。

  3. 关闭文件: 完成文件读写操作后,及时关闭文件。这是为了释放操作系统资源和确保数据的完整性。


需要注意的是,文件读写操作完成后应该及时关闭文件。一方面,文件对象会占用操作系统的资源;另一方面,操作系统对同时打开的文件描述符数量有限制。如果不及时关闭文件,可能导致资源泄漏和数据丢失。

三、文件打开模式

在不同编程语言中,打开文件的方法都需要指定文件打开模式。常见的文件打开模式包括只读('r')、只写('w')、只追加('a')、读写('r+')、写读('w+')、追加读写('a+')等。此外,还有处理二进制文件的模式('b')。


# Python中的文件打开模式with open('example.txt', 'r') as file:    content = file.read()    print(content)
复制代码


在打开文件时,指定不同的模式可以实现读、写、追加等不同的操作。

四、Python 文件操作步骤示例

让我们以读取一个文本文件 example.txt 的内容为例:


# Python文件操作示例file_path = 'example.txt'
# 最基本的文件读取with open(file_path, 'r') as file: content = file.read() print(content)
复制代码


这是一个简单的文件读取操作,使用 with 语句保证文件在使用完毕后被正确关闭。Python 3 提供了更加简洁的语法,同时处理了字符编码的问题,不再需要手动进行解码。这样的实践方式既简单又安全。

五、文件读取相关方法

Python 提供了多种文件读取方法,可以根据需求选择合适的方式:


  • read(): 一次性读取文件所有内容,返回一个字符串。

  • `read(size)


`: 每次最多读取指定长度的内容,返回一个字符串。


  • readlines(): 一次性读取文件所有内容,按行返回一个列表。

  • readline(): 每次只读取一行内容。


此外,还有两个与文件指针位置相关的方法:


  • seek(n): 将文件指针移动到指定字节的位置。

  • tell(): 获取当前文件指针所在字节位置。


下面是一些文件读取的实例操作:

1. 读取指定长度的内容

with open('example.txt', 'r', encoding='utf-8') as file:    print(file.read(12))
复制代码

2. 读取文件中的一行内容

with open('example.txt', 'r', encoding='utf-8') as file:    print(file.readline())
复制代码

3. 遍历打印一个文件中的每一行

with open('example.txt', 'r', encoding='utf-8', newline='') as file:    for line in file:        print(line, end='')
复制代码


这里注意到 newline='' 的设置,以避免在不同操作系统上产生的换行符问题。

六、文件读写与字符编码

在进行文件读写时,涉及到字符编码的指定。不同的编程语言和操作系统有默认的字符编码,但在文件读写时,最好明确指定字符编码,以确保数据的正确传输。


在 Python 中,文件读写时可以通过 open() 函数的 encoding 参数指定字符编码。例如:


# 读操作with open('example.txt', 'r', encoding='utf-8') as file:    print(file.read())
# 写操作with open('example.txt', 'w', encoding='utf-8') as file: file.write('你好')
复制代码


如果不指定字符编码,将使用平台相关的默认编码。在 Python 3 中,默认编码是与平台有关的,例如在 Windows 上是 GBK,而在 Linux 上是 UTF-8。


在 Python 2 中,需要手动进行编码和解码操作。读取文件时,需要使用 decode() 方法解码为字符串;写入文件时,需要使用 encode() 方法将字符串编码为字节串。


# 读操作(Python 2)with open('example.txt', 'r') as file:    content = file.read().decode('utf-8')
# 写操作(Python 2)with open('example.txt', 'w') as file: file.write(u'你好'.encode('utf-8'))
复制代码


在文件读写中,及时关闭文件并明确字符编码是良好的实践习惯,以确保数据的正确性和程序的健壮性。

七、上下文管理器与with语句

在文件读写中,使用 with 语句是一种良好的实践,它允许我们以一种清晰、简洁的方式打开和操作文件。同时,with 语句配合上下文管理器确保文件在使用后正确关闭。


在 Python 中,文件对象支持上下文管理协议,即实现了 __enter__()__exit__() 方法。with 语句在执行时,会调用文件对象的 __enter__() 方法获取资源,并在退出时调用 __exit__() 方法释放资源。这样可以避免因忘记关闭文件而导致的资源泄漏问题。


# 使用with语句读取文件with open('example.txt', 'r', encoding='utf-8') as file:    content = file.read()    print(content)# 文件在离开with代码块后自动关闭
复制代码

八、文件写操作


文件写操作通常用于将程序中的数据写入文件中。Python 提供了多种写入文件的方法,可以根据需求选择适合的方式。


# 写入字符串到文件with open('output.txt', 'w', encoding='utf-8') as file:    file.write('Hello, World!\n')    file.write('你好,世界!\n')
复制代码


上述代码使用 write() 方法将字符串写入文件,\n 表示换行符。注意在使用 'w' 模式打开文件时,如果文件已存在,会清空文件内容;如果文件不存在,会创建一个新文件。

九、文件操作的异常处理

文件读写操作可能会涉及到异常,例如文件不存在、权限问题、文件损坏等。因此,为了确保程序的健壮性,需要在文件操作时添加适当的异常处理机制。


try:    with open('example.txt', 'r', encoding='utf-8') as file:        content = file.read()        print(content)except FileNotFoundError:    print("文件未找到")except PermissionError:    print("无文件访问权限")except Exception as e:    print(f"发生异常:{e}")
复制代码


在上述代码中,通过 tryexcept 语句捕获了可能发生的异常。FileNotFoundError 用于捕获文件不存在的异常,PermissionError 用于捕获文件权限问题的异常,而 Exception 用于捕获其他未知异常。

十、文件指针的操作

文件指针表示文件中当前操作的位置。在文件读写中,文件指针的位置决定了下一次读写操作的位置。


  • seek(offset, whence): 将文件指针移动到指定位置。offset 表示移动的字节数,whence 表示移动的相对位置(0 表示文件开头,1 表示当前位置,2 表示文件结尾)。


with open('example.txt', 'r', encoding='utf-8') as file:    file.seek(5)  # 将文件指针移动到第6个字节的位置    content = file.read()    print(content)
复制代码


  • tell(): 获取当前文件指针所在位置的字节偏移量。


with open('example.txt', 'r', encoding='utf-8') as file:    print(file.tell())  # 获取当前文件指针位置    content = file.read()    print(content)    print(file.tell())  # 获取读取后的文件指针位置
复制代码


这些文件指针的操作方法可以用于在文件中定位和控制读写的位置。

十一、其他文件方法

除了上述介绍的方法外,文件对象还提供了其他一些方法:


  • flush(): 刷新缓冲区数据,将缓冲区中的数据立刻写入文件。

  • next(): 读取文件下一行,这个方法也是文件对象实例可以被当做迭代器使用的原因。

  • truncate(size=None): 截取文件中指定字节数的内容,并覆盖保存到文件中。如果不指定 size 参数,则文件将被清空。在 Python 2 中无返回值,在 Python 3 中返回新文件的内容字节数。

  • writelines(sequence): 向文件写入一个字符串或一个字符串列表,如果字符串列表中的元素需要换行,要自己加入换行符。

  • fileno(): 返回一个整型的文件描述符,可以用于一些底层 IO 操作上(如 os 模块的 read 方法)。

  • isatty(): 判断文件是否被连接到一个虚拟终端,是则返回 True,否则返回 False


这些方法可以根据实际需求来选择使用,提供了更多文件操作的灵活性。

十二、总结

文件读写是编程中常见的 I/O 操作,掌握文件操作的基本步骤、常用方法以及异常处理是 Python 编程的基础之一。通过 with 语句和上下文管理器,能够更加简洁、安全地进行文件操作。同时,理解文件指针的概念以及其他文件对象的方法,可以更灵活地处理文件的读写。良好的文件读写习惯有助于编写清晰、健壮的程序。

发布于: 刚刚阅读数: 2
用户头像

申公豹

关注

申公豹本豹 2023-06-05 加入

还未添加个人简介

评论

发布
暂无评论
Python文件操作指南:读写、异常处理与上下文管理器详解_Python_申公豹_InfoQ写作社区