文件
程序运行时,变量里的数据默认只存在于内存中。程序一结束,这些数据通常就消失了。
如果你想把内容长期保存下来,例如:
- 保存学习笔记
- 保存用户信息
- 保存日志
- 保存爬虫结果
- 保存配置文件
那你就必须学会文件操作。
所以这一节的重点,不是只会写 open() 这一个函数,而是要真正理解:程序怎样把内存里的数据写到磁盘里,又怎样从磁盘里读回来。
本节目标
- 理解为什么需要文件操作
- 学会使用
open()打开文件 - 学会读取文件内容
- 学会写入和追加内容
- 理解文件模式和编码
- 理解相对路径和绝对路径
- 学会使用
os处理文件和目录
为什么一定要学文件操作
先想一个最简单的例子:
name = "小明"
print(name)这段代码运行时,变量 name 只存在于程序运行过程中。程序一结束,这个值就没了。
如果你希望下次运行程序时,这个名字还在,就必须把它保存到文件里。
这就是文件操作最基本的意义:让数据脱离程序生命周期,独立保存下来。
文件是什么
你可以把文件理解成:保存在磁盘上的一段有名字的数据。
例如:
note.txtstudents.jsonconfig.iniresult.csv
从 Python 的角度看,文件常见用途大致有三类:
- 读取现有内容
- 写入新内容
- 追加更多内容
open():打开文件
文件操作的起点通常是 open()。
最常见写法:
file = open("note.txt", "r", encoding="utf-8")这行代码的意思是:
- 打开一个叫
note.txt的文件 - 以读取模式打开
- 按
utf-8编码处理内容
但在实际开发里,我们更推荐用 with open(...)。
为什么推荐 with open
with open("note.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)推荐它的原因是:
- 写法更规范
- 使用结束后会自动关闭文件
- 不容易忘记
close()
初学者常犯的一个错,就是自己 open() 了文件,最后忘记关闭。with open 可以帮你避开这种问题。
读取文件内容
read():一次读完全部内容
先假设 note.txt 文件中有这些内容:
Python 学习空间
欢迎你开始学习文件操作代码如下:
with open("note.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)输出结果:
Python 学习空间
欢迎你开始学习文件操作read() 的意思是:把整个文件内容都读成一个字符串。
readline():读取一行
with open("note.txt", "r", encoding="utf-8") as file:
line1 = file.readline()
line2 = file.readline()
print(line1)
print(line2)输出结果示例:
Python 学习空间
欢迎你开始学习文件操作注意:readline() 读出来的字符串通常会保留行尾换行符。
readlines():按行读取为列表
with open("note.txt", "r", encoding="utf-8") as file:
lines = file.readlines()
print(lines)输出结果示例:
['Python 学习空间\n', '欢迎你开始学习文件操作']这个方法的特点是:每一行都会变成列表中的一个元素。
写入文件
如果你想把程序中的数据保存到文件里,就要用写入模式。
w:写入模式
with open("note.txt", "w", encoding="utf-8") as file:
file.write("你好,文件操作")
print("写入完成")输出结果:
写入完成文件内容:
你好,文件操作w 模式的一个关键特点
如果文件原来有内容,w 会覆盖原内容。
例如原文件里是:
旧内容你执行:
with open("note.txt", "w", encoding="utf-8") as file:
file.write("新内容")最后文件里只会剩下:
新内容所以使用 w 时一定要清楚:它不是“补充”,而是“重写”。
追加内容
如果你不想覆盖原内容,而是想在后面继续添加,就要使用 a 模式。
with open("note.txt", "a", encoding="utf-8") as file:
file.write("\n继续追加一行内容")
print("追加完成")输出结果:
追加完成文件内容可能变成:
你好,文件操作
继续追加一行内容常见文件模式
你不需要一口气记住所有模式,但下面几个必须熟悉:
r:读取,文件必须存在w:写入,不存在就创建,存在就覆盖a:追加,不存在就创建,存在就在末尾追加
以后你还会见到:
rb:按二进制读取wb:按二进制写入
这在处理图片、音频、压缩包时很常见。
编码为什么重要
编码决定了文字如何被保存和解析。
最常见的编码是 utf-8。
如果你读写中文文件时编码不一致,就很容易出现乱码。
正确写法
with open("note.txt", "w", encoding="utf-8") as file:
file.write("你好,Python")读取时也要一致
with open("note.txt", "r", encoding="utf-8") as file:
print(file.read())如果写入和读取时都用 utf-8,通常就不会有乱码问题。
相对路径和绝对路径
这是初学者非常容易卡住的点。
相对路径
with open("note.txt", "r", encoding="utf-8") as file:
print(file.read())这里的 note.txt 是相对路径,表示“当前工作目录下的 note.txt”。
绝对路径
with open("C:/Users/Live1/Desktop/study/note.txt", "r", encoding="utf-8") as file:
print(file.read())这表示一个明确的完整路径。
为什么经常报“文件找不到”
很多时候不是文件真的不存在,而是因为:
- 你写的是相对路径
- 但程序运行时所在目录不是你以为的那个目录
所以你以后看到 FileNotFoundError,第一反应应该先检查路径。
按行写入数据
做项目时,经常不是只写一句话,而是写多条记录。
students = ["小明", "小红", "小刚"]
with open("students.txt", "w", encoding="utf-8") as file:
for name in students:
file.write(name + "\n")
print("写入完成")输出结果:
写入完成文件内容:
小明
小红
小刚这就是“把列表写入文件”的最基础做法。
读取文件并处理每一行
with open("students.txt", "r", encoding="utf-8") as file:
for line in file:
print("原始内容:", line)
print("去掉换行后:", line.strip())输出结果示例:
原始内容: 小明
去掉换行后: 小明
原始内容: 小红
去掉换行后: 小红
原始内容: 小刚
去掉换行后: 小刚strip() 在这里很重要,它可以去掉行尾的换行符和首尾空白。
用 os 模块处理文件和目录
前面学的是“打开文件并读写内容”,但实际项目里,你还经常要:
- 判断文件是否存在
- 创建目录
- 获取当前路径
- 删除文件
这时常用 os 模块。
判断文件是否存在
import os
print(os.path.exists("note.txt"))输出结果示例:
True获取当前工作目录
import os
print(os.getcwd())输出结果示例:
C:\Users\Live1\Desktop\study这能帮助你判断:当前相对路径到底是相对于哪个目录。
创建目录
import os
if not os.path.exists("data"):
os.mkdir("data")
print("目录创建完成")输出结果:
目录创建完成拼接路径
不要总是自己用字符串拼路径,更规范的方式是用:
import os
path = os.path.join("data", "students.txt")
print(path)输出结果示例:
data\students.txt一个完整示例:保存用户输入的学习记录
subject = input("请输入今天学习的主题:")
hours = input("请输入学习时长(小时):")
with open("study_log.txt", "a", encoding="utf-8") as file:
file.write(f"主题:{subject},时长:{hours} 小时\n")
print("学习记录保存成功")如果你输入:
Python文件操作
2那么文件里可能会新增一行:
主题:Python文件操作,时长:2 小时这就是一个非常接近真实场景的文件操作练习。
常见错误
1. 文件找不到
例如:
with open("abc.txt", "r", encoding="utf-8") as file:
print(file.read())如果 abc.txt 不存在,就会报错。
解决思路:
- 检查文件是否存在
- 检查路径是否正确
- 检查当前工作目录
2. 忘记指定编码
处理中文时,最好显式写上:
encoding="utf-8"3. 把 w 当成追加
很多人想“继续往后写一点”,结果用了 w,把整个文件内容覆盖掉了。
追加应该用 a。
4. 写多行时忘记加换行符
例如:
file.write(name)如果循环写多次,所有内容会挤在一行上。通常要加:
file.write(name + "\n")练习题
练习 1
创建一个 hello.txt 文件,写入一句中文欢迎语,再读取并打印出来。
练习 2
让用户输入 3 个姓名,把它们逐行保存到 names.txt 文件中。
练习 3
读取 names.txt,把每一行内容打印成:
学员姓名:小明练习 4
判断一个文件是否存在;如果不存在,就创建它并写入默认内容。
练习 5
创建一个 logs 目录,再在这个目录下写入一个 run.txt 文件。
本节小结
文件操作的核心意义,是让你的程序不再只活在内存里,而是能把数据真正保存下来。
你这一节最重要的收获应该是:
- 会用
with open - 会读文件
- 会写文件
- 会追加内容
- 知道编码和路径为什么重要
- 会用
os做基础文件管理
后面你无论做日志、爬虫结果保存、配置读取、数据导出,文件操作都会反复出现。这是非常基础但又非常实用的一项能力。