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 知识体系总览

下面这张图把文件操作基础的核心逻辑串起来了。你看一遍就能明白整个流程:

文件操作基础核心流程 开始 选择文件模式 r(只读)| w(写入)| a(追加) open() 打开文件 文件对象属性 name | mode | closed | encoding | fileno() close() 关闭文件 💡 最佳实践 用 with 语句 自动管理文件关闭 避免资源泄漏 ⚠️ 常见陷阱 'w' 模式会清空文件 忘记 close() 导致 文件句柄泄漏

这张图把整个流程串起来了:从选择模式开始,到打开文件、操作文件对象、最后关闭文件。你照着这个流程走,基本不会出大问题。

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% 的场景了。

好了,文件操作的基础就这些。说白了就是三步:打开、操作、关闭。把这三个动作练熟了,后面的读写操作就是水到渠成的事。

可可精品资料库