✅ 包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】!
1.操作文件:open()方法
- 用python读取文件(如txt、csv等),首先要用open函数打开这个文件
- open()函数是python的内置函数,它会返回一个文件对象,
- 这个文件对象拥有read、readline、write、close等方法
语法:
f = open(file_path, mode=‘r’, encoding=‘utf-8’)
- file_path:文件路径(如 ‘test.txt’)。
- mode:访问模式(默认 ‘r’)。
- encoding:编码格式(推荐 ‘utf-8’)
访问模式:

操作方法:
- 常见的文件写入、读取的操作方法:

关闭文件
必须显式调用 f.close():
- 释放系统资源,避免内存占用或数据错误。
- 未关闭时,Python 可能在程序结束时自动关闭,但不保证及时性。
展示示例
- 操作:新建了一个“test.txt”文件,然后在python代码中,使用open打开读取文件(r)并赋值给了f,再打印f。
1 # 打开文件
2 f = open('./test.txt', mode='r', encoding='utf-8')
3 # 打印下这个f,看看是个啥
4 print(f)
5 # print(f.read()) # 由于没有任何数据,就先注释掉了。
6 # 关闭文件
7 f.close()

2.写入数据
1.覆盖写入('w’模式)
- 向test_01.txt里写入数据。在‘w’模式下,文件不存在会创建一个。
1 f = open('test_01.txt', 'w', encoding='utf-8')
2 f.write('Hello World~\\n') # 写入内容(需手动换行)
3 f.write('你好世界')
4 f.close()

2. 追加写入('a’模式)
1 f = open('test_01.txt', 'a', encoding='utf-8')
2 f.write('\\n追加的内容') # 在文件末尾添加新行
3 f.close()
- 追加后的文件内容

3. 二进制写入('wb’模式)
- 在文件操作中,"wb"是写入模式的一种,它用于以二进制方式写入数据到文件中。
- 具体来说,"w"表示写入模式,"b"表示二进制模式,即将数据写入文件时不进行任何编码转换,
- 直接按照二进制格式写入。
1 import requests
2
3 # 爬取英雄联盟皮肤
4 url = r'https://game.gtimg.cn/images/lol/act/img/skin/big_5ba8083d-b371-4ad1-aaea-33ec5c3ac28b.jpg'
5 resp = requests.get(url)
6
7 f = open('安妮.jpg', 'wb')
8
9 f.write(resp.content)
10
11 f.close()

3.读取数据('r’模式)
1.read() 方法
- 一次性读取全部内容,返回字符串。
1 f = open('test_01.txt', 'r', encoding='utf-8')
2 # 读取所有数据
3 content = f.read()
4 print(content)
5 print(type(content))
6 f.close()

- 我们尝试在’r’模式写入会怎么样呢?
1 f = open('test_01.txt', 'r', encoding='utf-8')
2 # 读取所有数据
3 content = f.read()
4 print(content)
5 print(type(content))
6 f.write('haha') # r模式下不允许写入,会报错
7 f.close()

- read()方法的语法是:f.read(size=-1);
- 'read括号里是可以填入参数的,表示读取多少个字符的数据。默认‘-1’表示读取全部。
- 如果我们需要读取文件中的5个字节,就传入数字5:
1 f = open('test_01.txt', 'r', encoding='utf-8')
2 # 读取 5 个字节
3 part_a = f.read(5)
4 print(part_a)

- 如果我们在读取完5个字节后,再次执行读取操作时,会从上次读取的位置继续读取剩下的数据。
1 f = open('test_01.txt', 'r', encoding='utf-8')
2
3 # 读取 5 个字节
4 part_a = f.read(5)
5 print(part_a)
6 # 当我们再次执行读取操作时,是从上次读取的位置继续读取剩下的数据
7 part_b = f.read()
8 print(part_b)
9 f.close()

- 注意:用open打开文件时,如果使用的’r’做只读的操作,是可以省略不写的,即为open(‘文件名’)
1 # 用open打开文件时,如果使用的'r'做只读的操作,是可以省略不写的,
2 f = open('test_01.txt', encoding='utf-8')
3 content = f.read()
4 print(content)
5 f.close()

2.读取行数据(readlines())
- readlines可以按照行的方式,把文件中的内容进行一次性读取,并且返回一个列表。可以和read()对比一下:
1 f = open('test_01.txt', 'r', encoding='utf-8')
2 # 读取所有数据
3 content = f.read()
4 print('read读取模式')
5 print(type(content))
6 print(content)
7 f.close()
8
9 print('===============我是分割线===============')
10
11 # 关闭文件重新打开是为了让读取文件的指针从头开始
12 f = open('test_01.txt', 'r', encoding='utf-8')
13 content = f.readlines()
14 print('readlines读取模式')
15 print(type(content))
16 print(content)
17 for i in content:
18 print(i)
19 f.close()

3.读取行数据(readline())
- 逐行读取,返回字符串。文件末尾返回空字符串。
1 f = open('test_01.txt', 'r', encoding='utf-8')
2 line1 = f.readline() # 读取第一行
3 line2 = f.readline() # 读取第二行
4 line3 = f.readline() # 读取第二行
5 print(f"第一行:{line1}", f"\\n类型{type(line1)}")
6 print(f"第二行:{line2}", f"\\n类型{type(line2)}")
7 print(f"第三行:{line3}", f"\\n类型{type(line3)}")
8
9 f.close()

4.r+ 读写模式
模式特点:
- 文件要求:文件必须存在,否则报错 FileNotFoundError。
- 指针位置:打开时指针在文件开头。
- 写入行为:写入内容会从指针位置开始覆盖原内容。
代码示例:
- 覆盖写入:写入内容会直接覆盖原文件内容(从指针位置开始)。
- 指针位置:写入后指针停留在写入结束的位置,需手动调用 seek() 调整才能读取新内容。(下面会讲 seek() )
1 # 示例文件 test_r.txt 需提前存在
2 f = open('test_r.txt', 'r+', encoding='utf-8')
3
4 # 读取原内容(指针在开头)
5 content = f.read()
6 print("初始内容:", content) # 输出文件原有内容
7
8 # 写入新内容(从指针位置覆盖)
9 f.write('呵呵呵呵呵呵') # 写入内容,覆盖原内容的一部分
10
11 # 再次读取(此时指针在末尾,读取为空)
12 content = f.read()
13 print("写入后内容:", content) # 输出空字符串(需调整指针才能读取新内容)
14
15 f.close()

5.w+ 读写模式
模式特点:
- 文件要求:文件不存在则新建,存在则清空内容。
- 指针位置:打开时指针在文件开头。
- 写入行为:写入内容后需重置指针才能读取。
代码示例:
1 # 示例文件 test_w.txt(若存在则清空)
2 f = open('test_w.txt', 'w+', encoding='utf-8')
3
4 # 初始读取(文件被清空,内容为空)
5 content = f.read()
6 print("初始内容:", content) # 输出空字符串
7
8 # 写入新内容
9 f.write('嘿嘿嘿嘿嘿嘿') # 写入内容,指针移动到末尾
10
11 # 直接读取(指针在末尾,读取为空)
12 content = f.read()
13 print("写入后内容:", content) # 输出空字符串
14
15 f.close()
- 原始内容:

- 运行后:

- 原内容被覆盖写入新的内容,且读取不出来,因为指针在末尾。

6.seek() 函数与指针控制
- 我们再读写操作后,指针后移。执行 read() 或 write() 后,文件指针会停留在操作结束的位置,后续读取可能为空。
- 比如:
1 f = open('test_01.txt', 'r+', encoding='utf-8')
2 content = f.read() # 读取后指针在末尾
3 print("【第一次读取】:", content)
4 f.write('新内容') # 在末尾追加写入
5 content = f.read() # 继续读取时返回空(指针仍在末尾)
6 print("【继续读取】>", content)
7 f.close()
- 从运行结果,可以看到,再次读取由于指针在末尾,所以读取的内容是空的。

如何解决这个问题呢?
方式一:关闭后重新打开文件
- 完全重置文件状态:关闭文件后重新打开,指针回到文件开头。
1 # 第一次读取(指针移动到末尾)
2 f = open('test_01.txt', 'r', encoding='utf-8')
3 content = f.read()
4 print(content)
5 f.close()
6
7 # 重新打开文件(指针重置到开头)
8 f = open('test_01.txt', 'r', encoding='utf-8')
9 lines = f.readlines() # 可正常读取
10 print(lines)
11 f.close()

- 优缺点:

方式二:使用 seek() 指定指针位置
语法格式:f.seek(offset, whence=0)
offset:移动的字节数(可正负)。
whence:参考位置:
- 0:文件开头(默认)。
- 1:当前位置。
- 2:文件末尾。
常见用法:

- 代码示例:
1 f = open('test_01.txt', 'r+', encoding='utf-8')
2
3 # 读取全部内容(指针移动到末尾)
4 content = f.read()
5 print("原内容:", content)
6
7 # 重置指针到开头
8 f.seek(0)
9
10 # 写入内容(覆盖原内容)
11 f.write('覆盖内容')
12
13 # 再次重置指针到开头
14 f.seek(0)
15 new_content = f.read()
16 print("写入后内容:", new_content)
17
18 f.close()

- 优缺点:

- 适用场景:

7.文件的其它操作:os 库
os模块介绍
- os库是python标准库,包含几百个函数
- os就是“operating system”的缩写
- os模块提供的就是各种 Python 程序与操作系统进行交互的接口。
- 目前,计算机上主流的操作系统有Windows、Unix、Mac OS等,
- os模块为多操作系统的访问提供了相关功能的支持,涉及对文件相关操作功能的实现。
- 通过使用os模块,可以方便地与操作系统进行交互也可以极大增强代码的可移植性。
- os库提供通用的、基本的操作系统交互功能。
核心作用:
- 文件/目录的创建、删除、重命名。
- 路径管理、环境变量访问。
- 执行系统命令(如 os.system(‘ls’))。
文件操作
(1) 重命名文件
- 方法:os.rename(src, dst)
- 功能:将文件从旧路径 src 重命名为新路径 dst。
注意点:
- 如果新路径dst存在,会覆盖。
- 不支持跨磁盘操作。
用法示例:
os.rename(‘old.txt’, ‘new.txt’)
1 import os
2
3 os.rename("test_01.txt", "哈哈哈.txt")

(2) 删除文件
- 方法:os.remove(path)
- 功能:删除指定路径的文件。
注意点:
- 文件不存在时会抛出 FileNotFoundError。
用法示例:
os.remove(‘file.txt’)
1 import os
2 # 删除不存在的路径文件
3 # os.remove('./test3.txt')
4 # 删除存在的文件
5 os.remove('安妮.jpg')
- 删除不存在文件的报错。FileNotFoundError

- 删除存在文件:

目录操作
(1) 创建目录
- 方法:os.mkdir(path)
- 功能:创建单层目录。
注意点:
- 目录已存在时抛出 FileExistsError。
用法示例:
os.mkdir(‘my_folder’)
1 import os
2 # 创建已存在的目录
3 os.mkdir('./base_course/file_creation')
4 # 创建新目录
5 os.mkdir('文件操作目录')
- 已存在的路径创建文件夹,抛出的错误:FileExistsError

- 成功创建的:

(2) 删除目录
- 方法:os.rmdir(path)
- 功能:删除空目录。
注意点:
- 目录非空时抛出 OSError
用法示例:
os.rmdir(‘empty_folder’)
1 # 删除非空目录:比如删除file_creation
2 # os.rmdir('../Basic_courseware')
3 # 删除空目录:“文件操作目录”
4 os.rmdir("../file_creation/文件操作目录")
- 删除非空目录:OSError

- 删除空目录:

(3) 获取当前目录
- 方法:os.getcwd()
- 功能:返回当前工作目录的绝对路径。
用法示例:
1 # 获取当前路径
2 get_path = os.getcwd()
3 print(get_path)

(4) 列出目录内容
- 方法:os.listdir(path)
- 功能:返回指定目录下的文件和子目录名称列表。
注意点:
- 不递归列出子目录内容。
- 返回结果不包含完整路径。
用法示例:
1 # 不传递参数时:
2 path_A = os.listdir()
3 print(path_A)
4
5 # 传递参数时:
6 path_B = os.listdir('../base_homework')
7 print(path_B)
- 不传递path参数的,返回当前运行文件夹的文件:

- 传递path参数,比如要查看base_homework这个文件夹下面的文件:

路径处理函数
(1) 获取绝对路径
- 方法:os.path.abspath(path)
- 功能:将相对路径转换为绝对路径。
用法示例:
1 import os
2 # os.path.abspath('给定的路径(相对路径)') : 将传入的相对路径转换为绝对路径
3 path = os.path.abspath('./example_18.py')
4 print(path)

(2) 规范化路径
- 方法:os.path.normpath(path)
- 功能:清理路径中的冗余符号(如 … 和 .)。
用法示例:
1 # os.path.normpath('给定的路径(可能冗余,啰嗦)'):将传入的写得不规范的路径转换为规范路径
2 path = './my_folder/../my_file.txt' # my_file.txt
3 path_ok = os.path.normpath(path)
4 print(path_ok) # 输出:my_file.txt

(3) 拼接路径
- 方法:os.path.join(path1, path2)
- 功能:智能拼接多个路径片段。
用法示例:
1 # 拼接路径
2 full_path = os.path.join('dir', 'subdir', 'file.txt')
3 print(full_path) # 输出:dir/subdir/file.txt(Windows 下为 dir\\subdir\\file.txt)

存在性检查
1.检查路径是否存在
- 方法:os.path.exists(path)
参数:
- path:文件或目录的路径(字符串)。
返回值:
- True:路径存在。
- False:路径不存在。
安全创建单层目录
1 import os
2 os.mkdir('data')
3
4
5 # 文件路径
6 file_path = './data'
7 #
8 print(os.path.exists(file_path))
9
10 # 判断文件夹是否存在
11 if os.path.exists(file_path):
12 print('文件存在!')
13 else:
14 os.mkdir(file_path)
15 print('已新建1个新文件')

处理多级目录(扩展)
- 若需创建多级目录(如 ./data/images/2025),应使用 os.makedirs():
1 import os
2
3 dir_path = './data/images/2025'
4 os.makedirs(dir_path) # makedirs创建多层目录
5
6 if not os.path.exists(dir_path):
7 os.makedirs(dir_path) # 递归创建多级目录
8 print(f'目录树 {dir_path} 创建成功!')
9 else:
10 print(f'目录树 {dir_path} 已存在!')

8.with上下文管理器
- 使用with来操作文件的方法,叫做上下文操作,
- 意为将文件的打开、读写、关闭都在with这一步中完成了。
- 在with内部的操作,同上面的文件操作没有差异。
语法规则:
1 with open(文件路径, 模式) as 文件对象:
2 # 操作代码块
3 # 退出 with 块后,文件自动关闭
- as 变量 是可选的(如 with open(…) as f)。
- 可以同时管理多个资源(如 with open(a) as f1, open(b) as f2)
- 退出 with 块后,会自动关闭文件(无需手动调用close()),即使代码块内发生错误,文件也会关闭。
使用with和直接open的方式对比:
- 先写一个错误的代码:在只读模式下写入
1 f = open('test_w.txt', 'r', encoding='utf-8')
2 info = f.read()
3 print(info)
4 f.write('jajaja')
5 f.close()
- 必然报错:会导致文件无法关闭

那么我们可以如何处理呢?用try-except…试下:
finally 的可靠性:
- 若 open() 成功但后续操作出错,f.close() 仍会执行。
- 但若 open() 失败(如下一示例),f 未定义,f.close() 报错!
1 try:
2 f = open("test_w.txt", "r", encoding='utf-8')
3 f.write("呵呵呵呵呵呵") # 试图向只读文件写入内容
4 except Exception as e:
5 print("文件操作出错", e) # 捕获异常:io.UnsupportedOperation
6 else:
7 print('文件操作没有问题')
8 finally:
9 f.close() # 正确关闭文件
10 print("关闭成功!")

如果是不存在的文件:
- open() 失败导致 f 未赋值,f.close() 触发 NameError。
1 try:
2 f = open("hehe.txt", "r", encoding='utf-8') # 文件不存在
3 f.write("呵呵呵呵呵呵")
4 except Exception as e:
5 print("文件操作出错", e) # 捕获异常:FileNotFoundError
6 else:
7 print('文件操作没有问题')
8 finally:
9 f.close() # 报错!因为 f 未成功创建

我们可以使用with去处理这个问题:
- with 语句的这种写法,既简单又安全,
- 并且 with 语句执行完成以后自动调用关闭文件操作,
- 即使出现异常也会自动调用关闭文件操作
1 try:
2 # 文件不存在时,with 仍能安全处理
3 with open("hehe.txt", "r", encoding='utf-8') as f:
4 f.write("呵呵") # 触发异常
5 except Exception as e:
6 print("操作出错:", e) # 捕获异常
7 # 无需 finally,文件一定不会泄漏

🟢 总结
- 最后希望你编程学习上不急不躁,按照计划有条不紊推进,把任何一件事做到极致,都是不容易的,加油,努力!相信自己!
🟡 文末福利
- 最后这里免费分享给大家一份Python全套学习资料,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。
🔴包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】领取!
- ① Python所有方向的学习路线图,清楚各个方向要学什么东西
- ② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
- ③ 100多个Python实战案例,学习不再是只会理论
- ④ 华为出品独家Python漫画教程,手机也能学习




