当前位置: 首页 > news >正文

Python 文件操作详解:从基础到实践

在 Python 编程中,文件操作是一项至关重要的技能。它能够让我们和外部存储设备里的数据进行交互,实现数据的读取、写入和修改。无论是处理配置文件、记录日志,还是进行数据持久化,文件操作都必不可少。接下来,我们会详细介绍 Python 中文件操作的各个方面。

一、文件打开

在 Python 里,借助内置的open()函数来打开文件,其基本语法如下:

file = open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
  • file:要打开的文件的路径,可以是相对路径或绝对路径。
  • mode:打开文件的模式,常见的模式有:
    • 'r':只读模式(默认),如果文件不存在则会引发 FileNotFoundError
    • 'w':写入模式,如果文件已存在则会覆盖原有内容;如果文件不存在则创建新文件。
    • 'a':追加模式,在文件末尾追加内容,如果文件不存在则创建新文件。
    • 'x':独占创建模式,如果文件已存在则会引发 FileExistsError
    • 'b':二进制模式,用于处理二进制文件,如图片、音频等。
    • 't':文本模式(默认),用于处理文本文件。
  • buffering:指定缓冲策略,默认值 -1 表示使用系统默认的缓冲机制。
  • encoding:指定文件的编码方式,如 'utf-8''gbk' 等。
  • errors:指定如何处理编码错误。
  • newline:控制换行符的处理方式。
  • closefd:如果为 True(默认),则在关闭文件时会关闭文件描述符。
  • opener:自定义打开文件的方式。

1. 相对路径与绝对路径

  • 相对路径:是相对于当前工作目录的路径。例如,当前工作目录为/home/user/project,若文件test.txtproject目录下的data子目录中,那么相对路径可写成data/test.txt
  • 绝对路径:是从根目录开始的完整路径。在上述例子中,若系统根目录为/,则绝对路径是/home/user/project/data/test.txt 。

2. 打开模式

模式                                                                     描述
'r'以只读模式打开文件。文件指针会置于文件开头,若文件不存在则抛出FileNotFoundError异常。
'w'以写入模式打开文件。若文件已存在,会清空文件原有内容;若文件不存在,则创建新文件。
'a'以追加模式打开文件。文件指针会放在文件末尾,若文件不存在,则创建新文件。
'x'以独占创建模式打开文件。若文件已存在,则抛出FileExistsError异常;若文件不存在,则创建新文件。
'b'以二进制模式打开文件,可与其他模式组合使用,如'rb''wb'等,用于处理非文本文件,如图像、音频等。
't'以文本模式打开文件(默认模式),可与其他模式组合使用,如'rt''wt'等,用于处理文本文件 。
'+'以读写模式打开文件,可与其他模式组合使用,如'r+''w+''a+'等。
详细模式讲解
  • 'r'(只读模式)
    当你使用'r'模式打开文件时,意味着你只能读取文件内容,而不能对其进行修改。文件指针会被自动定位到文件的起始位置。例如:
try:file = open('test.txt', 'r')content = file.read()print(content)file.close()
except FileNotFoundError:print("文件未找到,请检查文件路径。")

在这个例子中,如果test.txt文件存在,就会读取其全部内容并打印;若文件不存在,则会捕获FileNotFoundError异常并输出提示信息。

  • 'w'(写入模式)
    使用'w'模式打开文件时,若文件已经存在,其原有内容会被全部清空;若文件不存在,则会创建一个新文件。例如:
file = open('test.txt', 'w')
file.write("这是新写入的内容。")
file.close()

此代码会清空test.txt文件原有的内容,然后写入新的字符串"这是新写入的内容。"

  • 'a'(追加模式)
    'a'模式用于在文件末尾追加新内容。若文件不存在,会创建一个新文件。例如:
file = open('test.txt', 'a')
file.write("\n追加的新内容。")
file.close()

这里会在test.txt文件的末尾添加一行新内容"追加的新内容。"

  • 'x'(独占创建模式)
    该模式用于创建新文件,若文件已经存在,会抛出FileExistsError异常。例如:
try:file = open('new_file.txt', 'x')file.write("新文件的内容。")file.close()
except FileExistsError:print("文件已存在,无法以独占创建模式打开。")

new_file.txt文件不存在,会创建该文件并写入内容;若文件已存在,则会捕获异常并输出提示信息。

  • 'b'(二进制模式)
    二进制模式通常和其他模式组合使用,如'rb'(二进制只读)、'wb'(二进制写入)等,用于处理非文本文件,如图像、音频等。例如:
# 以二进制只读模式打开图片文件
with open('image.jpg', 'rb') as file:image_data = file.read()
# 以二进制写入模式将图片数据写入新文件
with open('new_image.jpg', 'wb') as new_file:new_file.write(image_data)

这段代码将image.jpg文件以二进制只读模式打开,读取其数据,然后以二进制写入模式将数据写入new_image.jpg文件。

  • 't'(文本模式)
    文本模式是默认模式,可与其他模式组合使用,如'rt''wt'等,用于处理文本文件。在文本模式下,Python 会自动处理换行符等文本相关的转换。例如:
with open('text.txt', 'rt') as file:lines = file.readlines()for line in lines:print(line.strip())

此代码以文本只读模式打开text.txt文件,逐行读取内容并打印,同时去除每行末尾的换行符。

  • '+'(读写模式)
    '+'模式可与其他模式组合,形成不同的读写模式。
    • 'r+':以读写模式打开文件,文件指针位于文件开头,会保留文件原有内容。例如:
with open('test.txt', 'r+') as file:content = file.read()file.write("新添加的内容。")

先读取文件原有内容,然后在文件末尾添加新内容。

  • 'w+':以读写模式打开文件,会清空文件原有内容。例如:
with open('test.txt', 'w+') as file:file.write("新的内容。")file.seek(0)  # 将文件指针移到文件开头content = file.read()print(content)

先写入新内容,然后将文件指针移到开头,读取并打印内容。

  • 'a+':以读写模式打开文件,文件指针位于文件末尾,从文件末尾开始追加写入,读取时需移动文件指针。例如:
with open('test.txt', 'a+') as file:file.write("追加的内容。")file.seek(0)  # 将文件指针移到文件开头content = file.read()print(content)

先在文件末尾追加内容,然后将文件指针移到开头,读取并打印文件全部内容。

二、文件读取

打开文件后,我们可以运用多种方法读取文件内容。

1. read()方法

read()方法用于读取文件的全部内容,并返回一个字符串。

try:file = open('test.txt', 'r')content = file.read()print(content)file.close()
except FileNotFoundError:print("文件未找到,请检查文件路径。")

上述代码打开test.txt文件,读取全部内容并打印,最后关闭文件。需要注意的是,若文件较大,一次性读取全部内容可能会占用过多内存,此时可指定读取的字节数,如file.read(10),表示读取文件的前 10 个字节。

2. readline()方法

readline()方法用于逐行读取文件内容,每次调用只读取一行,返回一个字符串,字符串末尾包含换行符\n

try:file = open('test.txt', 'r')line = file.readline()while line:print(line.strip())  # 使用strip()方法去除换行符line = file.readline()file.close()
except FileNotFoundError:print("文件未找到,请检查文件路径。")

上述代码逐行读取test.txt文件内容并打印,直到读取完所有行。

3. readlines()方法

readlines()方法用于读取文件的所有行,并返回一个包含所有行的列表,列表中的每个元素为文件的一行内容,末尾包含换行符\n

try:file = open('test.txt', 'r')lines = file.readlines()for line in lines:print(line.strip())file.close()
except FileNotFoundError:print("文件未找到,请检查文件路径。")

上述代码读取test.txt文件的所有行,并遍历打印每一行内容。

三、文件写入

1. write()方法

write()方法用于向文件中写入内容,接受一个字符串作为参数。

try:file = open('test.txt', 'w')file.write("Hello, World!")file.close()
except Exception as e:print(f"写入文件时发生错误:{e}")

上述代码以写入模式打开test.txt文件,写入字符串"Hello, World!",若文件不存在则创建新文件,若存在则清空原有内容。

2. writelines()方法

writelines()方法用于将一个字符串序列(如列表)写入文件,不会自动添加换行符,需要手动添加。

lines = ["Line 1\n", "Line 2\n", "Line 3\n"]
try:file = open('test.txt', 'w')file.writelines(lines)file.close()
except Exception as e:print(f"写入文件时发生错误:{e}")

上述代码将列表lines中的内容写入test.txt文件。

四、文件关闭

使用完文件后,需要及时关闭文件,以释放系统资源。可以使用close()方法关闭文件。

file = open('test.txt', 'r')
# 进行文件操作
file.close()

但这种方式存在一个问题,如果在文件操作过程中发生异常,close()方法可能无法执行,从而导致资源泄漏。为了避免这种情况,推荐使用with语句。

with open('test.txt', 'r') as file:content = file.read()print(content)
# 离开with块后,文件会自动关闭

with语句会在代码块执行完毕后,自动调用文件对象的close()方法关闭文件,即使在执行过程中发生异常也能确保文件被正确关闭。

五、文件指针操作

在文件操作过程中,我们可以通过seek()方法移动文件指针的位置,tell()方法用于获取文件指针当前的位置(以字节为单位)。

1. seek()方法

seek(offset, whence)方法用于移动文件指针,其中offset表示偏移量,whence表示参考位置。

  • whence = 0:表示从文件开头开始计算偏移量(默认值)。
  • whence = 1:表示从当前文件指针位置开始计算偏移量(仅适用于二进制模式)。
  • whence = 2:表示从文件末尾开始计算偏移量(仅适用于二进制模式)。
try:file = open('test.txt', 'r+')file.seek(5)  # 将文件指针移动到第5个字节的位置content = file.read()print(content)file.close()
except FileNotFoundError:print("文件未找到,请检查文件路径。")

上述代码将文件指针移动到第 5 个字节的位置,然后读取后续内容。

2. tell()方法

tell()方法返回文件指针当前的位置。

try:file = open('test.txt', 'r')file.read(3)  # 读取前3个字节position = file.tell()print(position)file.close()
except FileNotFoundError:print("文件未找到,请检查文件路径。")

上述代码读取文件的前 3 个字节后,获取文件指针当前的位置并打印。

通过以上对 Python 文件操作的详细讲解,我们掌握了文件打开、读取、写入、关闭以及文件指针操作等核心知识。合理运用这些知识,能够高效地处理各种文件相关的任务,无论是简单的文本处理,还是复杂的数据存储与读取,都能轻松应对。

上述内容系统梳理了 Python 文件操作知识。若你对特定方法还有疑问,或想了解更多文件操作应用场景,欢迎和我交流。

http://www.xdnf.cn/news/295093.html

相关文章:

  • 面向对象与过程介绍
  • Java学习手册:Hibernate/JPA 使用指南
  • Oracle OCP认证考试考点详解083系列08
  • 高速接口:PCIe 3.0 Link Training的详细过程
  • 5.4 - 5.5Web基础+c语言拓展功能函数
  • MyDB - 手写数据库
  • Spring 框架的底层原理
  • 【Fifty Project - D22】
  • 三维重建(二十一)——第二步和第三步
  • 相机biaoding
  • 进程与线程:06 操作系统之“树”
  • GESP2024年3月认证C++八级( 第二部分判断题(1-5))
  • URL混淆与权限绕过技术
  • pta的cpp选择判断题
  • 【C语言编译】编译原理和详细过程
  • 数据库的原子事务
  • Cursor报错Your request has been blocked解决方案
  • JavaSE核心知识点01基础语法01-02(基本数据类型、运算符、运算符优先级)
  • 【信息系统项目管理师-论文真题】2006下半年论文详解(包括解题思路和写作要点)
  • 学习黑客Nmap 命令法诀
  • 深入浅出数据库的函数依赖关系
  • 数据库原理——E-R图的极速省流理解 例题解析
  • 编译与链接
  • APEX和AI Vector免费认证报名流程分享
  • 融智学核心范式的数学表述:融智学范式革命的总括性阐释——一场文明认知的量子跃迁
  • linux 交叉编译报错 ERROR: sdl2 requested but not found
  • Gradio全解20——Streaming:流式传输的多媒体应用(6)——构建视频流目标检测系统
  • 【NLP】29. 高效训练与替代模型:让语言模型更轻、更快、更强
  • 暂停线程的三种方式:join、sleep、yield
  • 教育应用场景下多智能体系统中交互模型的案例迁移