Python文件操作

Python文件操作

2026年9月18日·#编程学习/python学习笔记Python/文件操作·1766 字 9 分钟
浏览量加载中...
AI 摘要

文件读写三步法(打开/读写/关闭)、r/w/a 三种模式、相对路径与绝对路径,以及资源释放的最佳实践

三步法:打开 → 读/写 → 关闭#

日常我们操作文件时,基本分为三步操作:打开、读/写、关闭。

读文件#

# 1. 打开文件
f = open("resources/望庐山瀑布.txt", "r", encoding="utf-8")
# 2. 读取文件
content = f.read()
print(content)
# 3. 关闭文件
f.close()

写文件#

# 1. 打开文件
f = open("resources/静夜思.txt", "w", encoding="utf-8")
# 2. 写入文件
f.write("窗前明月光,\n")
f.write("疑是地上霜。\n")
f.write("举头望明月,\n")
f.write("低头思故乡。\n")
# 3. 关闭文件
f.close()
Warning

如果操作完文件并未调用 close 方法关闭文件,同时程序没有停止运行,那么这个文件将一直被 Python 程序占用,无法操作(比如在资源管理器里删除或改名会失败;写入的内容也可能还没真正落盘)。

编码是什么#

编码:是将字符(文字、数字、符号)转换为计算机能够存储和处理的数字代码的规则系统,如:ASCII、GBK、UTF-8。

写中文文本时必须指定 encoding="utf-8",否则在 Windows 上会按系统默认编码(GBK)读写,容易出现乱码或 UnicodeDecodeError

路径写法#

写法含义示例
相对路径相对于当前工作目录的路径resources/静夜思.txt
绝对路径从文件系统的目录开始,完整地描述文件位置的路径D:/python/第3章/resources/静夜思.txt
Tip

在项目开发中,推荐使用相对路径写法:可移植性更好、路径简洁、易于阅读。(换台电脑、换个目录,绝对路径就失效了)

操作模式#

模式含义
r只读的方式打开文件,指针放在文件的开头(默认模式)
w只写入模式,从头编辑,原有内容会被删除;文件不存在则创建新文件
a追加模式,新内容会被追加在原有内容之后;文件不存在则创建新文件
Warning

w 模式最危险的地方是打开的一瞬间原内容就没了,即使后面一个字都没写。只想在末尾加内容就用 a

补充(本章未涉及但常用的模式):r+ 读写、w+ 清空后读写、a+ 追加读写;加 b 表示二进制模式(如 rbwb 用于图片、音频)。

常用的读/写方法#

方法作用
f.read()读取所有内容,返回一个字符串
f.readlines()按行读取全部内容,返回一个列表(每行末尾带 \n
f.write("...")写入字符串(不会自动换行,需要手动写 \n
f = open("resources/望庐山瀑布.txt", "r", encoding="utf-8")
content_list = f.readlines()
for line in content_list:
print(line.strip()) # strip() 去掉每行末尾的换行符
f.close()

资源释放:两种方案#

问题:如果操作文件过程中出现了异常,程序就跳过了 close,文件无法关闭了,怎么解决?

方式一:try…finally#

# 1. 打开文件
f = open("resources/静夜思.txt", "w", encoding="utf-8")
try:
# 2. 写入文件内容
f.write("静夜思(李白)\n")
f.write("窗前明月光,\n")
i = 1 / 0 # 这里抛异常
f.write("疑是地上霜。\n")
finally:
print("关闭文件")
# 3. 关闭文件
f.close()

不管 try 里面是否出错,finally 里的代码都会执行,所以文件一定会被关闭。

方式二:with open(推荐,最佳实践)#

# 写文件
with open("resources/静夜思.txt", "w", encoding="utf-8") as f:
f.write("静夜思(李白)\n\n")
f.write("窗前明月光,\n")
f.write("疑是地上霜。\n")
f.write("举头望明月,\n")
f.write("低头思故乡。\n")
对比try…finallywith open
代码量需要手动写 try/finally 和 close不用写 close
可读性繁琐简洁
是否自动释放手动释放即使发生异常,也会被正确释放
Important

with 语句(上下文管理器)的核心作用就是确保资源总是被正确获取和释放,也是项目开发中的推荐方式。本章项目里的文件读写全部用的是 with open(...)

小结(复习自测)#

题目答案
文件的操作(读/写)分为哪几步打开:open() 函数;读/写:read()write() 方法;关闭:close() 方法
文件资源释放的最佳实践try...finallywith open()(推荐,最佳实践)

相关#

练习题#

一、回忆填空(写完再展开对答案)#

  1. 文件操作三步:、读/写、
  2. 打开文件:open("resources/静夜思.txt", "____", encoding="____")
  3. 读取全部内容:f.____();按行读取返回列表:f.____()
  4. 写入内容:f.____("窗前明月光,\n")(不会自动换行,要自己写 ____)
  5. 三种模式:r 只读、w 从头编辑会 ____ 原有内容、a 是 ____ 模式
  6. 资源释放最推荐的方式:____ open(...) as f(即使异常也会正确释放)
  7. try…finally 里的 finally 作用是:不管是否出异常,____ 都会执行
  8. 编码的作用是把字符转换成计算机能存储的 ____,中文一般用 ____ 编码
填空答案(做完再点开)
  1. 打开、关闭 2. r / utf-8 3. read / readlines 4. write / \n 5. 清空(删除)/ 追加 6. with 7. 代码 8. 数字代码 / UTF-8

二、裸写题#

  • 2-1 写文件 把《静夜思》四句诗写进 poem.txt(每句一行,标题单独一行),写完关闭文件。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:打开 → 写 → 关闭;每行末尾要自己加换行符 二级 · 方法open(..., "w", encoding="utf-8") / f.write(...) / f.close() 三级 · 骨架f.write("疑是地上霜。\____")

    参考答案(做完再点开)
    # 1. 打开文件
    f = open("poem.txt", "w", encoding="utf-8")
    # 2. 写入内容(每行末尾要自己写 \n)
    f.write("静夜思(李白)\n")
    f.write("窗前明月光,\n")
    f.write("疑是地上霜。\n")
    f.write("举头望明月,\n")
    f.write("低头思故乡。\n")
    # 3. 关闭文件
    f.close()
  • 2-2 读文件 把上一步写出的 poem.txt 读出来,逐行打印(每行末尾不要多出空行)。

    提示

    一级 · 思路:按行读会得到带换行符的列表,打印前先把换行符去掉 二级 · 方法f.readlines() + line.strip() 三级 · 骨架for line in f.readlines(): print(line.____())

    参考答案(做完再点开)
    f = open("poem.txt", "r", encoding="utf-8")
    content_list = f.readlines()
    for line in content_list:
    print(line.strip()) # strip() 去掉每行末尾的换行符
    print(f"共 {len(content_list)} 行")
    f.close()
  • 2-3 with 与三种模式with open(...) 重写写文件;然后对比 wa:先用 w 写一次,再用 a 追加一次,观察原内容有没有被保留。

    提示

    一级 · 思路w 打开的一瞬间原内容就没了,a 是在末尾接着写 二级 · 方法with open(..., "a", encoding="utf-8") as f: 三级 · 骨架:跑两次程序,观察文件内容的变化

    参考答案(做完再点开)
    # with open:不用手动 close,出异常也会正确释放
    with open("poem.txt", "w", encoding="utf-8") as f:
    f.write("第一行\n")
    f.write("第二行\n")
    # a 模式:追加,原内容保留
    with open("poem.txt", "a", encoding="utf-8") as f:
    f.write("第三行(追加的)\n")
    with open("poem.txt", "r", encoding="utf-8") as f:
    print(f.read())
    # 如果第二步也用 "w",原内容会被清空,最后只剩"第三行"
    # 再试 "r" 模式写入会报错:io.UnsupportedOperation: not writable

评论区

[ 标签 ]
# AI37# AI 编程2# AI工具1# Ajax2# Apifox1# AstrBot3# Astro2# CC Switch1# CDN2# Claude Code1# claudecode2# ClaudeCode1# Cloudflare2# CloudFlare2# CloudFlare-ImgBed3# coc3# CSS6# DeepSeek6# deepseek2# DELETE1# Docker1# EdgeOne3# Gist1# git1# GitHub1# hexo-circle-of-friends1# HTML6# HTTP5# ImageManager1# Java23# java13# JavaScript5# JDBC3# JSON2# JUnit1# LangChain25# Logback1# Maven6# Muse Spark1# Mybatis1# MyBatis4# MySQL28# MySql1# NapCat1# Node.js1# obsidian2# Obsidian5# OpenCode4# ORM1# PathVariable1# PicGo1# PyCharm1# Python65# RequestBody1# RequestMapping1# RESTful风格1# skills1# Slf4j1# SpringBoot11# SQL2# Streamlit5# Svelte2# TailwindCSS1# Telegram3# Tlias2# Vercel1# vscode2# Vue7# Waline3# WebDAV1# Web基础6# Web开发6# WinSCP1# YAML1# 三层架构1# 中二宣言1# 书籍1# 使用文档10# 写作1# 函数2# 刷步数1# 前端32# 动态1# 动漫1# 包1# 单词2# 博客7# 博客工作流1# 博客开发2# 参数接收1# 友链1# 反思2# 图床6# 地图1# 备份2# 大模型1# 奇思妙想1# 存储1# 学习方法6# 学校1# 宝塔面板3# 宝宝10# 对象1# 导航栏1# 工具2# 开发1# 开发工具1# 开发规范1# 开心1# 异常处理1# 影视2# 微信1# 性能优化2# 总结1# 想法15# 感受1# 感悟11# 指南1# 提示词工程1# 插件5# 故障排除1# 效率工具2# 教程10# 数据分析9# 数据库27# 数据结构1# 文件操作2# 斩神1# 日常92# 日志框架1# 朋友圈1# 朱元璋1# 模块1# 模板1# 正则表达式2# 测试1# 游戏2# 爬虫7# 生活迁移1# 电影2# 电脑1# 碎碎念1# 视觉识别1# 类1# 类型注解1# 网络基础2# 网络教室1# 羊毛2# 脚本2# 脚本工具1# 自动化2# 蓝奏云1# 订阅推荐2# 记录2# 评论系统1# 词根1# 词缀1# 说说1# 足迹1# 跑步2# 路径参数1# 转载2# 运动1# 部落冲突1# 配置1# 随机图1# 面向对象5# 音乐3# 音标1# 饮食1# 驼峰命名1# 高德地图1
[ 公告 ]

如果你喜欢,那么欢迎来到我的世界!

了解更多
[ 音乐 ]
封面

音乐

暂未播放

0:000:00
暂无歌词
找不到相关结果。
[ contents ]
[ 全部文章 ]