Skip to content

文件

程序运行时,变量里的数据默认只存在于内存中。程序一结束,这些数据通常就消失了。

如果你想把内容长期保存下来,例如:

  • 保存学习笔记
  • 保存用户信息
  • 保存日志
  • 保存爬虫结果
  • 保存配置文件

那你就必须学会文件操作。

所以这一节的重点,不是只会写 open() 这一个函数,而是要真正理解:程序怎样把内存里的数据写到磁盘里,又怎样从磁盘里读回来。

本节目标

  • 理解为什么需要文件操作
  • 学会使用 open() 打开文件
  • 学会读取文件内容
  • 学会写入和追加内容
  • 理解文件模式和编码
  • 理解相对路径和绝对路径
  • 学会使用 os 处理文件和目录

为什么一定要学文件操作

先想一个最简单的例子:

python
name = "小明"
print(name)

这段代码运行时,变量 name 只存在于程序运行过程中。程序一结束,这个值就没了。

如果你希望下次运行程序时,这个名字还在,就必须把它保存到文件里。

这就是文件操作最基本的意义:让数据脱离程序生命周期,独立保存下来。

文件是什么

你可以把文件理解成:保存在磁盘上的一段有名字的数据。

例如:

  • note.txt
  • students.json
  • config.ini
  • result.csv

从 Python 的角度看,文件常见用途大致有三类:

  • 读取现有内容
  • 写入新内容
  • 追加更多内容

open():打开文件

文件操作的起点通常是 open()

最常见写法:

python
file = open("note.txt", "r", encoding="utf-8")

这行代码的意思是:

  • 打开一个叫 note.txt 的文件
  • 以读取模式打开
  • utf-8 编码处理内容

但在实际开发里,我们更推荐用 with open(...)

为什么推荐 with open

python
with open("note.txt", "r", encoding="utf-8") as file:
    content = file.read()
    print(content)

推荐它的原因是:

  • 写法更规范
  • 使用结束后会自动关闭文件
  • 不容易忘记 close()

初学者常犯的一个错,就是自己 open() 了文件,最后忘记关闭。with open 可以帮你避开这种问题。

读取文件内容

read():一次读完全部内容

先假设 note.txt 文件中有这些内容:

text
Python 学习空间
欢迎你开始学习文件操作

代码如下:

python
with open("note.txt", "r", encoding="utf-8") as file:
    content = file.read()
    print(content)

输出结果:

text
Python 学习空间
欢迎你开始学习文件操作

read() 的意思是:把整个文件内容都读成一个字符串。

readline():读取一行

python
with open("note.txt", "r", encoding="utf-8") as file:
    line1 = file.readline()
    line2 = file.readline()

    print(line1)
    print(line2)

输出结果示例:

text
Python 学习空间

欢迎你开始学习文件操作

注意:readline() 读出来的字符串通常会保留行尾换行符。

readlines():按行读取为列表

python
with open("note.txt", "r", encoding="utf-8") as file:
    lines = file.readlines()
    print(lines)

输出结果示例:

text
['Python 学习空间\n', '欢迎你开始学习文件操作']

这个方法的特点是:每一行都会变成列表中的一个元素。

写入文件

如果你想把程序中的数据保存到文件里,就要用写入模式。

w:写入模式

python
with open("note.txt", "w", encoding="utf-8") as file:
    file.write("你好,文件操作")

print("写入完成")

输出结果:

text
写入完成

文件内容:

text
你好,文件操作

w 模式的一个关键特点

如果文件原来有内容,w 会覆盖原内容。

例如原文件里是:

text
旧内容

你执行:

python
with open("note.txt", "w", encoding="utf-8") as file:
    file.write("新内容")

最后文件里只会剩下:

text
新内容

所以使用 w 时一定要清楚:它不是“补充”,而是“重写”。

追加内容

如果你不想覆盖原内容,而是想在后面继续添加,就要使用 a 模式。

python
with open("note.txt", "a", encoding="utf-8") as file:
    file.write("\n继续追加一行内容")

print("追加完成")

输出结果:

text
追加完成

文件内容可能变成:

text
你好,文件操作
继续追加一行内容

常见文件模式

你不需要一口气记住所有模式,但下面几个必须熟悉:

  • r:读取,文件必须存在
  • w:写入,不存在就创建,存在就覆盖
  • a:追加,不存在就创建,存在就在末尾追加

以后你还会见到:

  • rb:按二进制读取
  • wb:按二进制写入

这在处理图片、音频、压缩包时很常见。

编码为什么重要

编码决定了文字如何被保存和解析。

最常见的编码是 utf-8

如果你读写中文文件时编码不一致,就很容易出现乱码。

正确写法

python
with open("note.txt", "w", encoding="utf-8") as file:
    file.write("你好,Python")

读取时也要一致

python
with open("note.txt", "r", encoding="utf-8") as file:
    print(file.read())

如果写入和读取时都用 utf-8,通常就不会有乱码问题。

相对路径和绝对路径

这是初学者非常容易卡住的点。

相对路径

python
with open("note.txt", "r", encoding="utf-8") as file:
    print(file.read())

这里的 note.txt 是相对路径,表示“当前工作目录下的 note.txt”。

绝对路径

python
with open("C:/Users/Live1/Desktop/study/note.txt", "r", encoding="utf-8") as file:
    print(file.read())

这表示一个明确的完整路径。

为什么经常报“文件找不到”

很多时候不是文件真的不存在,而是因为:

  • 你写的是相对路径
  • 但程序运行时所在目录不是你以为的那个目录

所以你以后看到 FileNotFoundError,第一反应应该先检查路径。

按行写入数据

做项目时,经常不是只写一句话,而是写多条记录。

python
students = ["小明", "小红", "小刚"]

with open("students.txt", "w", encoding="utf-8") as file:
    for name in students:
        file.write(name + "\n")

print("写入完成")

输出结果:

text
写入完成

文件内容:

text
小明
小红
小刚

这就是“把列表写入文件”的最基础做法。

读取文件并处理每一行

python
with open("students.txt", "r", encoding="utf-8") as file:
    for line in file:
        print("原始内容:", line)
        print("去掉换行后:", line.strip())

输出结果示例:

text
原始内容: 小明

去掉换行后: 小明
原始内容: 小红

去掉换行后: 小红
原始内容: 小刚

去掉换行后: 小刚

strip() 在这里很重要,它可以去掉行尾的换行符和首尾空白。

os 模块处理文件和目录

前面学的是“打开文件并读写内容”,但实际项目里,你还经常要:

  • 判断文件是否存在
  • 创建目录
  • 获取当前路径
  • 删除文件

这时常用 os 模块。

判断文件是否存在

python
import os

print(os.path.exists("note.txt"))

输出结果示例:

text
True

获取当前工作目录

python
import os

print(os.getcwd())

输出结果示例:

text
C:\Users\Live1\Desktop\study

这能帮助你判断:当前相对路径到底是相对于哪个目录。

创建目录

python
import os

if not os.path.exists("data"):
    os.mkdir("data")

print("目录创建完成")

输出结果:

text
目录创建完成

拼接路径

不要总是自己用字符串拼路径,更规范的方式是用:

python
import os

path = os.path.join("data", "students.txt")
print(path)

输出结果示例:

text
data\students.txt

一个完整示例:保存用户输入的学习记录

python
subject = input("请输入今天学习的主题:")
hours = input("请输入学习时长(小时):")

with open("study_log.txt", "a", encoding="utf-8") as file:
    file.write(f"主题:{subject},时长:{hours} 小时\n")

print("学习记录保存成功")

如果你输入:

text
Python文件操作
2

那么文件里可能会新增一行:

text
主题:Python文件操作,时长:2 小时

这就是一个非常接近真实场景的文件操作练习。

常见错误

1. 文件找不到

例如:

python
with open("abc.txt", "r", encoding="utf-8") as file:
    print(file.read())

如果 abc.txt 不存在,就会报错。

解决思路:

  • 检查文件是否存在
  • 检查路径是否正确
  • 检查当前工作目录

2. 忘记指定编码

处理中文时,最好显式写上:

python
encoding="utf-8"

3. 把 w 当成追加

很多人想“继续往后写一点”,结果用了 w,把整个文件内容覆盖掉了。

追加应该用 a

4. 写多行时忘记加换行符

例如:

python
file.write(name)

如果循环写多次,所有内容会挤在一行上。通常要加:

python
file.write(name + "\n")

练习题

练习 1

创建一个 hello.txt 文件,写入一句中文欢迎语,再读取并打印出来。

练习 2

让用户输入 3 个姓名,把它们逐行保存到 names.txt 文件中。

练习 3

读取 names.txt,把每一行内容打印成:

text
学员姓名:小明

练习 4

判断一个文件是否存在;如果不存在,就创建它并写入默认内容。

练习 5

创建一个 logs 目录,再在这个目录下写入一个 run.txt 文件。

本节小结

文件操作的核心意义,是让你的程序不再只活在内存里,而是能把数据真正保存下来。

你这一节最重要的收获应该是:

  • 会用 with open
  • 会读文件
  • 会写文件
  • 会追加内容
  • 知道编码和路径为什么重要
  • 会用 os 做基础文件管理

后面你无论做日志、爬虫结果保存、配置读取、数据导出,文件操作都会反复出现。这是非常基础但又非常实用的一项能力。

Built with VitePress.