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

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. 注意事项

  1. 文件关闭

    • 总是用 with open(...) as f 语句,它会自动关闭文件(即使发生异常)。
    • 如果手动打开文件,务必调用 f.close()
  2. 指针位置

    • 写入时,文件指针的位置会影响写入内容的位置(如 'a' 模式指针在末尾)。
  3. 文本 vs 二进制

    • 文本模式(如 'r'):自动处理换行符(\n 转换为系统特定的换行符,如 Windows 的 \r\n)。
    • 二进制模式(如 'rb'):直接读取原始字节,不处理换行符。
  4. 异常处理

    • 文件不存在时,'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 语句管理文件,确保资源正确释放。

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

相关文章:

  • C++高性能日志库spdlog
  • 深入浅出限流算法(二):更平滑的滑动窗口
  • Python 如何操作数据库,让你使用 DeepSeek 开发数据库应用更加快 (Orm Bee)
  • MySQL复合查询
  • HTML 从标签到动态效果的基础
  • react-navigation-draw抽屉导航
  • ArkTS基础实验 (二)
  • 数字人Live_Talking的搭建和使用
  • OpenResty深度解析:从卓伊凡的”隐形主流”论看其深度原理与应用生态-卓伊凡
  • 深入理解java线程池
  • stm32 阻塞式延时 与 非阻塞式延时
  • “数字驱动·智建未来——2025河北省建筑电气与智能化技术交流大会”
  • 【ACL系列论文写作指北14-科研心态与抗压管理】-走得远,比走得快更重要
  • 不同参数大小的DeepSeekR1模型对Java中new FileInputStream(“test.txt“).seek(100);语法错误的检查
  • 学习笔记:Qlib 量化投资平台框架 — MAIN COMPONENTS (Part I)
  • XrayR启动失败
  • 架构进阶:详解108页系统架构设计与详细设计知识讲座【附全文阅读】
  • 品融电商:全域电商代运营的领航者,驱动品牌长效增长
  • 第四章:Messaging and Memory
  • C语言中的指针详解
  • RSS‘25|CMU提出统一空中操作框架:以末端执行器为中心,无人机实现高精度遥操作
  • Cursor + Figma-Context-MCP ,让 Cursor 获取 Figma 设计图信息,实现 AI 生成页面的高度还原
  • 力扣面试150题--K 个一组翻转链表
  • 机器人--激光雷达
  • ESG跨境电商怎么样?esg跨境电商有哪些功用?
  • 阅读MySQL实战45讲第11天
  • uniapp打包apk如何实现版本更新
  • Spring MVC异常处理利器:深入理解HandlerExceptionResolver
  • SpringBoot实现接口防刷的5种高效方案详解
  • C#/.NET/.NET Core技术前沿周刊 | 第 36 期(2025年4.21-4.27)