1. 文件操作基础:打开与关闭文件
文件读写,说白了就是让程序和硬盘上的文件打交道。我刚开始学Python时,觉得这玩意儿特简单——不就是读个文件嘛?结果第一次写代码就把文件搞坏了,数据全丢了。嗯,从那以后我再也不敢小看文件操作了。
今天咱们就从头捋一遍,把文件打开、关闭、模式选择这些基本功打扎实。你想想看,如果连门都开不对,后面的读写操作肯定要翻车。
1.1 open() 函数——打开文件的第一把钥匙
Python里打开文件用的是内置函数 open()。它的基本用法长这样:
file_object = open(file_name, mode)
第一个参数是文件名,第二个参数是打开模式。我习惯把文件对象叫做 f 或者 file,简单明了。
来看个实际例子:
f = open('data.txt', 'r')
print(f.name) # 输出:data.txt
print(f.mode) # 输出:r
print(f.closed) # 输出:False
f.close()
这里我打开了当前目录下的 data.txt,模式是 'r'(只读)。然后打印了文件对象的三个属性:文件名、打开模式、是否已关闭。
1.2 文件模式——r、w、a 到底怎么选?
文件模式是 open() 的灵魂。选错了模式,轻则报错,重则把文件内容清空。我见过太多新手用 'w' 模式打开一个已有文件,结果里面的数据全没了。
咱们把三种最常用的模式掰开揉碎了讲:
| 模式 | 名称 | 文件存在时 | 文件不存在时 | 写入位置 |
|---|---|---|---|---|
'r' |
只读模式 | 正常打开 | 报错 FileNotFoundError | 不能写入 |
'w' |
写入模式 | 清空内容 | 创建新文件 | 文件开头 |
'a' |
追加模式 | 保留内容 | 创建新文件 | 文件末尾 |
为什么会有这些区别?说白了就是安全考虑。只读模式防止你误操作把文件改了;写入模式默认清空,是为了保证你写入的内容是完整的;追加模式则适合日志这种不断增长的场景。
'w' 模式打开了一个配置文件的路径,结果程序一跑,配置文件被清空了,整个服务直接崩了。从那以后,我只要写文件,都会先确认模式是不是 'a' 或者 'r+'。
1.3 文件对象属性——你手里的文件长什么样?
文件对象本身有一些属性,能告诉你当前文件的状态。我平时调试时经常用它们来确认文件是否正常打开。
f = open('example.txt', 'r')
# 文件名
print(f.name) # example.txt
# 打开模式
print(f.mode) # r
# 是否已关闭
print(f.closed) # False
# 编码方式(文本模式)
print(f.encoding) # cp936 或 utf-8
# 文件句柄编号
print(f.fileno()) # 3
f.close()
print(f.closed) # True
这里有个细节:encoding 属性在二进制模式下是不存在的。我遇到过有人用二进制模式打开文本文件,然后想获取编码,结果报错了。嗯,这个坑踩过一次就记住了。
1.4 close() 方法——用完记得关门
文件打开后,一定要记得关闭。为什么?因为操作系统对同时打开的文件数量有限制。我见过一个爬虫程序,开了几千个文件没关,最后系统报错说"打开的文件太多"。
f = open('data.txt', 'r')
# 做各种操作...
f.close() # 一定要调用
不过,Python 提供了更优雅的方式——with 语句。它会自动帮你关闭文件,哪怕中间出了异常:
with open('data.txt', 'r') as f:
content = f.read()
# 文件操作在这里做
# 出了 with 块,文件自动关闭
print(f.closed) # True
with 语句。省心、安全、代码还简洁。你想想看,少写一行 close(),少一个出 bug 的机会,多划算。
1.5 知识体系总览
下面这张图把文件操作基础的核心逻辑串起来了。你看一遍就能明白整个流程:
这张图把整个流程串起来了:从选择模式开始,到打开文件、操作文件对象、最后关闭文件。你照着这个流程走,基本不会出大问题。
1.6 实战小练习
光看不练假把式。我建议你动手写个脚本,试试不同模式的效果:
# 试试 'w' 模式
with open('test_w.txt', 'w') as f:
f.write('第一次写入\n')
# 试试 'a' 模式
with open('test_w.txt', 'a') as f:
f.write('第二次追加\n')
# 试试 'r' 模式
with open('test_w.txt', 'r') as f:
content = f.read()
print(content)
运行这段代码,你会发现 'w' 模式每次都会清空文件,而 'a' 模式会在末尾追加。这就是它们最本质的区别。
'r',写新文件用 'w',追加内容用 'a'。这三个模式够你应付 90% 的场景了。
好了,文件操作的基础就这些。说白了就是三步:打开、操作、关闭。把这三个动作练熟了,后面的读写操作就是水到渠成的事。