欢迎光临
我们一直在努力

【Python零基础到进阶】文件操作


包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】!

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漫画教程,手机也能学习

可以扫描下方二维码领取【保证100%免费】在这里插入图片描述

赞(0)
未经允许不得转载:171主机测评 » 【Python零基础到进阶】文件操作
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址