文件操作基础:打开与关闭文件
说实话,文件读写这事儿,看着简单,但坑真不少。我刚开始写Python那会儿,就因为在文件操作上栽过跟头——程序跑着跑着突然报错,说文件句柄用完了。后来才明白,打开的文件不关,就像借了书不还,图书馆迟早要找你麻烦。
今天咱们就把文件操作的基础打扎实。你想想看,不管是写日志、存配置、还是做数据持久化,第一步都是打开文件。这一步走稳了,后面才顺。
1. open() 函数:打开文件的钥匙
Python里打开文件用的是内置函数 open()。它的基本用法很简单:
file_object = open(file_name, mode)
这里 file_name 是文件路径,mode 是打开模式。返回值是一个文件对象,咱们后续的读写操作都靠它。
我个人习惯:路径里尽量用正斜杠
/,哪怕在Windows上。这样代码跨平台时不用改。比如 "data/log.txt" 而不是 "data\\log.txt"。
2. 文件模式:r/w/a 三兄弟
文件模式决定了你能对文件做什么。说白了就三种核心模式:
| 模式 | 名称 | 说明 | 文件不存在时 |
|---|---|---|---|
'r' |
读取模式 | 只能读,不能写 | 报错 |
'w' |
写入模式 | 只能写,会清空原内容 | 创建新文件 |
'a' |
追加模式 | 在文件末尾追加内容 | 创建新文件 |
嗯,这里要注意:'w' 模式会直接清空文件。我曾经有个同事,调试时用了 'w' 模式,结果把一整天攒的日志全清了……所以我现在每次用 'w' 都会多看一眼。
另外还有几个扩展模式:
'r+':读写模式,不会清空文件'w+':读写模式,会清空文件'a+':读写模式,追加写入'b':二进制模式,比如'rb'读二进制文件
我曾经踩过的坑:用
'r+' 模式时,写入位置默认在文件开头。如果你先读后写,写入会覆盖开头的内容,而不是追加到末尾。要追加的话,得先 seek() 到文件末尾。
3. 关闭文件:close() 的必要性
文件用完了要关,这是铁律。为什么?
- 操作系统对打开的文件数量有限制
- 不关闭可能导致数据丢失(缓冲区没刷入磁盘)
- 文件被占用时,其他程序无法操作
标准做法是:
f = open('data.txt', 'r')
# 读写操作...
f.close()
但这样有个问题——如果中间代码报错了,close() 可能执行不到。所以我强烈推荐用 with 语句:
with open('data.txt', 'r') as f:
# 读写操作...
# 退出with块后,文件自动关闭
用 with 的好处是,哪怕里面抛异常了,文件也会被正确关闭。我个人现在写文件操作,99% 的情况都用 with。
4. 文件对象属性:了解你的文件
文件对象本身带了一些有用的属性,咱们可以随时查看:
| 属性 | 说明 | 示例 |
|---|---|---|
f.name |
文件名 | 'data.txt' |
f.mode |
打开模式 | 'r' |
f.closed |
文件是否已关闭 | True 或 False |
f.encoding |
文件编码 | 'utf-8' |
举个例子:
with open('example.txt', 'w', encoding='utf-8') as f:
print(f'文件名: {f.name}')
print(f'模式: {f.mode}')
print(f'编码: {f.encoding}')
print(f'是否关闭: {f.closed}')
# 退出with后
print(f'是否关闭: {f.closed}') # 输出 True
小技巧:调试时可以用
f.closed 检查文件是否被意外关闭了。我遇到过几次因为文件提前关闭导致读写失败的情况,查了半天才发现是 close() 被提前调用了。
5. 知识体系总览
下面这张图把文件操作基础的核心逻辑串起来了,你看一遍就能记住:
这张图把整个流程串起来了:打开 → 选模式 → 读写 → 关闭。你想想看,是不是每一步都有讲究?
6. 完整示例:从打开到关闭
最后给个完整的例子,把今天讲的东西都用上:
# 写入文件
with open('demo.txt', 'w', encoding='utf-8') as f:
f.write('Hello, 文件操作!\n')
f.write('这是第二行。\n')
print(f'写入完成,文件名: {f.name}')
# 读取文件
with open('demo.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(f'读取内容:\n{content}')
print(f'文件是否关闭: {f.closed}')
# 追加内容
with open('demo.txt', 'a', encoding='utf-8') as f:
f.write('这是追加的内容。\n')
# 再次读取验证
with open('demo.txt', 'r', encoding='utf-8') as f:
print(f'追加后的内容:\n{f.read()}')
核心要点总结:
- 用
open()打开文件,指定模式和编码 - 用
with语句管理文件上下文,自动关闭 - 选对模式:读用
'r',写用'w',追加用'a' - 善用文件对象属性做调试
好了,文件操作的基础就这些。说白了就是三步:打开、操作、关闭。但每一步都有细节,多练几次就熟了。下次咱们聊具体的读写方法——read、write、readline 这些,到时候你会发现,基础打好了,后面都是水到渠成的事。