python10天- 文件操作模式详解
Python 中的文件操作模式决定了如何打开和操作文件。通过 open()
函数的 mode
参数指定模式,可以控制文件的读写行为。以下是 Python 文件操作模式的详细解释,包括常见模式、特点、使用场景和示例代码。
1. 基础模式
1.1 'r'
- 只读模式(默认模式)
- 说明:以只读方式打开文件。
- 特点:
- 文件必须存在,否则会抛出
FileNotFoundError
。 - 打开后可以读取文件内容,但不能写入。
- 文件指针(读写位置)会定位到文件开头。
- 文件必须存在,否则会抛出
- 使用场景:仅需读取文件内容。
- 示例:
with open("file.txt", "r") as f:content = f.read()print(content)
1.2 'w'
- 写入模式(覆盖写入)
- 说明:以写入方式打开文件,若文件不存在则创建。
- 特点:
- 如果文件已存在,会清空文件内容。
- 文件指针定位到文件开头。
- 只能写入(
write()
),不能读取。
- 使用场景:需要覆盖或新建文件并写入内容。
- 示例:
with open("new_file.txt", "w") as f:f.write("Hello, World!")
1.3 'a'
- 追加模式
- 说明:以追加方式打开文件,若文件不存在则创建。
- 特点:
- 文件指针定位到文件末尾,新写入的内容会追加到文件末尾。
- 如果文件已存在,不会清空原有内容。
- 只能写入(
write()
),不能读取。
- 使用场景:需要向文件末尾追加内容(如日志记录)。
- 示例:
with open("log.txt", "a") as f:f.write("\nNew log entry added.")
2. 扩展模式(组合模式)
2.1 'r+'
- 读写模式
- 说明:以读写方式打开文件。
- 特点:
- 文件必须存在,否则会抛出
FileNotFoundError
。 - 文件指针在开头,可以读取和写入。
- 写入会覆盖原有内容,需注意文件指针的位置。
- 文件必须存在,否则会抛出
- 使用场景:需要同时读取和修改文件内容。
- 示例:
with open("data.txt", "r+") as f:content = f.read() # 读取内容f.write("Appended text") # 写入内容(覆盖当前位置后的内容)# 需要使用 seek() 调整指针位置以避免覆盖
2.2 'w+'
- 覆盖读写模式
- 说明:以读写方式打开文件,若文件存在则清空,否则创建新文件。
- 特点:
- 文件指针定位到开头。
- 可读可写,但写入会覆盖原有内容。
- 使用场景:需要重写或创建文件并读取内容。
- 示例:
with open("data.txt", "w+") as f:f.write("New content") # 写入内容f.seek(0) # 将指针移到开头以读取content = f.read()print(content)
2.3 'a+'
- 追加读写模式
- 说明:以读写方式打开文件,若不存在则创建,以追加方式写入。
- 特点:
- 文件指针在文件末尾,写入会追加到末尾。
- 可以读取文件内容,但读取时需调整指针位置(如
seek(0)
)。
- 使用场景:需要追加内容并读取文件。
- 示例:
with open("log.txt", "a+") as f:f.write("\nNew entry") # 追加内容f.seek(0) # 移动指针到开头以读取整个文件content = f.read()print(content)
3. 二进制模式(适用于非文本文件)
所有模式后加 'b'
表示以二进制模式打开文件,适用于处理图片、可执行文件等非文本数据。
3.1 'rb'
- 二进制只读
- 说明:以二进制模式读取文件。
- 特点:
- 文件必须存在。
- 读取返回字节(bytes)类型数据。
- 使用场景:读取二进制文件(如
.jpg
,.exe
)。 - 示例:
with open("image.jpg", "rb") as f:image_data = f.read() # 返回 bytes 类型
3.2 'wb'
- 二进制覆盖写入
- 说明:以二进制模式写入文件,覆盖原有内容。
- 使用场景:写入二进制数据(如保存图片)。
- 示例:
with open("output.jpg", "wb") as f:f.write(b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00') # 写入字节数据
3.3 'ab'
- 二进制追加
- 说明:以二进制模式追加写入。
- 使用场景:追加二进制数据(如日志文件)。
- 示例:
with open("binary_data.bin", "ab") as f:f.write(b'\x01\x02\x03') # 追加字节数据
4. 独占创建模式 'x'
4.1 'x'
- 新建文件写入
- 说明:如果文件不存在,以写入方式创建;如果文件已存在,抛出
FileExistsError
。 - 特点:
- 安全创建文件,避免覆盖已有文件。
- 只能写入,不能读取。
- 使用场景:需要确保文件未被创建时写入。
- 示例:
try:with open("new_file.txt", "x") as f:f.write("This file is newly created.") except FileExistsError:print("File already exists!")
5. 组合模式(其他扩展)
'xb'
:以二进制模式新建文件,若文件存在则报错。with open("new_binary_file.bin", "xb") as f:f.write(b'\x00\x01')
6. 总结表格
模式 | 描述 | 读权限 | 写权限 | 创建文件 | 覆盖内容 | 指针位置 | 适用场景 |
---|---|---|---|---|---|---|---|
'r' | 只读 | √ | × | × | × | 文件开头 | 读取现有文件 |
'w' | 写入(覆盖) | × | √ | √ | √ | 文件开头 | 创建或重写文件 |
'a' | 追加 | × | √ | √ | × | 文件末尾 | 追加内容到文件末尾 |
'r+' | 读写(文件必须存在) | √ | √ | × | × | 文件开头 | 修改现有文件内容 |
'w+' | 读写(覆盖) | √ | √ | √ | √ | 文件开头 | 重写文件并读取 |
'a+' | 读写(追加写入) | √ | √ | √ | ×(追加) | 文件末尾(写入时) | 追加并读取文件 |
'rb' | 二进制只读 | √ | × | × | × | 文件开头 | 处理二进制文件(如图片) |
'wb' | 二进制覆盖写入 | × | √ | √ | √ | 文件开头 | 写入二进制数据 |
'ab' | 二进制追加 | × | √ | √ | × | 文件末尾 | 追加二进制数据 |
'x' | 独占创建写入 | × | √ | √ | × | 文件开头 | 安全创建新文件 |
7. 注意事项
-
文件关闭:
- 总是用
with open(...) as f
语句,它会自动关闭文件(即使发生异常)。 - 如果手动打开文件,务必调用
f.close()
。
- 总是用
-
指针位置:
- 写入时,文件指针的位置会影响写入内容的位置(如
'a'
模式指针在末尾)。
- 写入时,文件指针的位置会影响写入内容的位置(如
-
文本 vs 二进制:
- 文本模式(如
'r'
):自动处理换行符(\n
转换为系统特定的换行符,如 Windows 的\r\n
)。 - 二进制模式(如
'rb'
):直接读取原始字节,不处理换行符。
- 文本模式(如
-
异常处理:
- 文件不存在时,
'r'
,'r+'
会抛出FileNotFoundError
。 - 文件已存在时,
'x'
会抛出FileExistsError
。
- 文件不存在时,
8. 示例代码
示例1:读取文件
with open("data.txt", "r") as f:for line in f:print(line.strip())
示例2:写入并追加
# 写入
with open("log.txt", "w") as f:f.write("Initial content\n")# 追加
with open("log.txt", "a") as f:f.write("Added content\n")
示例3:二进制读写
# 写入二进制数据
with open("binary.dat", "wb") as f:f.write(b'\x00\x01\x02\x03')# 读取二进制数据
with open("binary.dat", "rb") as f:data = f.read()print(data) # 输出:b'\x00\x01\x02\x03'
通过合理选择文件模式,可以精确控制文件的读写行为,避免数据丢失或意外覆盖。建议优先使用 with
语句管理文件,确保资源正确释放。