文件操作基础:打开与关闭文件

说实话,文件读写这事儿,看着简单,但坑真不少。我刚开始写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. 知识体系总览

下面这张图把文件操作基础的核心逻辑串起来了,你看一遍就能记住:

文件操作基础核心流程 open() 打开文件 选择文件模式 'r' 只读 'w' 写入(清空) 'a' 追加 执行读写操作 close() 关闭文件 推荐做法 使用 with 语句 自动关闭文件 避免资源泄漏

这张图把整个流程串起来了:打开 → 选模式 → 读写 → 关闭。你想想看,是不是每一步都有讲究?

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 这些,到时候你会发现,基础打好了,后面都是水到渠成的事。

可可精品资料库