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.txt
在project
目录下的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 文件操作知识。若你对特定方法还有疑问,或想了解更多文件操作应用场景,欢迎和我交流。