一、文件的概念
1.1 文件的概念和作用
计算机的 文件,就是存储在某种 长期储存设备 上的一段 数据
长期存储设备包括:硬盘、U 盘、移动硬盘、光盘…
文件的作用
将数据长期保存下来,在需要的时候使用
思考:文件操作包含什么?
答:打开、关闭、读、写、复制…
思考:文件操作的的作用是什么?
答:读取内容、写入内容、备份内容…
总结:文件操作的作用就是把一些内容(数据)存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力。
1.2 文件的存储方式(二进制)
在计算机中,文件是以 二进制 的方式保存在磁盘上的
1.3 文本文件和二进制文件
文本文件
可以使用 文本编辑软件 查看
本质上还是二进制文件
例如:python 的源程序
二进制文件
保存的内容 不是给人直接阅读的,而是 提供给其他软件使用的
例如:图片文件、音频文件、视频文件等等
二进制文件不能使用 文本编辑软件 查看
二、文件的基本操作
2.1 文件操作步骤
在 计算机 中要操作文件的套路非常固定,一共包含三个步骤:
打开文件
读、写文件
读 将文件内容读入内存
写 将内存内容写入文件
关闭文件
注意:可以只打开和关闭文件,不进行任何读写操作。
2.2 操作文件的函数/方法
在 Python 中要操作文件需要记住 1 个函数和 3 个方法
open 函数的第一个参数是要打开的文件名(文件名区分大小写)
如果文件 存在,返回 文件操作对象
如果文件 不存在,会 抛出异常
read 方法可以一次性 读入 并 返回 文件的 所有内容
close 方法负责 关闭文件
如果 忘记关闭文件,会造成系统资源消耗,而且会影响到后续对文件的访问
注意:read 方法执行后,会把 文件指针 移动到 文件的末尾
提示
在开发中,通常会先编写 打开 和 关闭 的代码,再编写中间针对文件的 读/写 操作!
open
函数负责打开文件,并且返回文件对象read
/write
/close
三个方法都需要通过 文件对象 来调用
2.2.1 打开文件的方式
open
函数默认以 只读方式 打开文件,并且返回文件对象
语法如下:
f = open("文件名", "访问方式")
提示
- 频繁的移动文件指针,会影响文件的读写效率,开发中更多的时候会以 只读、只写 的方式来操作文件
- 示例
f = open('test.txt', 'w')
注意:此时的f
是open
函数的文件对象。
2.2.2 文件对象方法
2.2.2.1 写–write
- 语法
文件对象.write('内容')
- 体验
# 1. 打开文件 f = open('test.txt', 'w') # 2.文件写入 f.write('hello world') # 3. 关闭文件 f.close()
注意:
w和a模式:如果文件不存在则创建该文件;如果文件存在,w模式先清空再写入,a模式直接末尾追加。
r模式:如果文件不存在则报错。
2.2.2.2 读—按行读取
read()
read 方法默认会把文件的 所有内容 一次性读取到内存
如果文件太大,对内存的占用会非常严重
注意:read 方法执行后,会把 文件指针 移动到 文件的末尾
文件对象.read(num)
num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。
# 1. 打开 - 文件名需要注意大小写 file = open("README") # 2. 读取 text = file.read() print(text) # 3. 关闭 file.close()
readline()
readline 方法可以一次读取一行内容
方法执行后,会把 文件指针 移动到下一行,准备再次读取。
f = open('test.txt') content = f.readline() print(f'第一行:{content}') content = f.readline() print(f'第二行:{content}') # 关闭文件 f.close()
第一行:hello world
第二行:abcdefg
读取大文件的正确姿势
# 打开文件 file = open("README") while True: # 读取一行内容 text = file.readline() # 判断是否读到内容 if not text: break # 每读取一行的末尾已经有了一个 `\n` print(text, end="") # 关闭文件 file.close()
- readlines( )
- readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。
f = open('test.txt') content = f.readlines() # ['hello world\n', 'abcdefg\n', 'aaa\n', 'bbb\n', 'ccc'] print(content) # 关闭文件 f.close()
文件指针(知道)
- 文件指针 标记 从哪个位置开始读取数据
- 第一次打开 文件时,通常 文件指针会指向文件的开始位置
- 当执行了
read
方法后,文件指针会移动到读取内容的末尾
- 默认情况下会移动到 文件末尾
思考
如果执行了一次 read 方法,读取了所有内容,那么再次调用 read 方法,还能够获得到内容吗?
答案
不能
第一次读取之后,文件指针移动到了文件末尾,再次调用不会读取到任何的内容
2.2.2.3 seek()—用来移动文件指针
作用:用来移动文件指针。
语法如下:
文件对象.seek(偏移量, 起始位置)
起始位置:
- 0:文件开头
- 1:当前位置
- 2:文件结尾
2.2.2.4 关闭
文件对象.close()
三、文件备份
需求:用户输入当前目录下任意文件名,程序完成对该文件的备份功能(备份文件名为xx[备份]后缀,例如:test[备份].txt)。
3.1 步骤
- 接收用户输入的文件名
- 规划备份文件名
- 备份文件写入数据
3.2 代码实现
- 接收用户输入目标文件名
old_name = input('请输入您要备份的文件名:')
- 规划备份文件名
2.1 提取目标文件后缀
2.2 组织备份的文件名,xx[备份]后缀
# 2.1 提取文件后缀点的下标 index = old_name.rfind('.') # print(index) # 后缀中.的下标 # print(old_name[:index]) # 源文件名(无后缀) # 2.2 组织新文件名 旧文件名 + [备份] + 后缀 # [:index]切片,从开始到.之前的索引值 new_name = old_name[:index] + '[备份]' + old_name[index:] # 打印新文件名(带后缀) # print(new_name)
- 备份文件写入数据
3.1 打开源文件 和 备份文件
3.2 将源文件数据写入备份文件
3.3 关闭文件
# 3.1 打开文件 old_f = open(old_name, 'rb') new_f = open(new_name, 'wb') # 3.2 将源文件数据写入备份文件 # 如果不确定目标文件大小,循环读取写入,当读取出来的数据没有了终止循环 while True: con = old_f.read(1024) if len(con) == 0: break new_f.write(con) # 3.3 关闭文件 old_f.close() new_f.close()
3.3 思考
如果用户输入.txt
,这是一个无效文件,程序如何更改才能限制只有有效的文件名才能备份?
答:添加条件判断即可。
old_name = input('请输入您要备份的文件名:') index = old_name.rfind('.') if index > 0: postfix = old_name[index:] new_name = old_name[:index] + '[备份]' + postfix old_f = open(old_name, 'rb') new_f = open(new_name, 'wb') while True: con = old_f.read(1024) if len(con) == 0: break new_f.write(con) old_f.close() new_f.close()
3.4 复制文件
小文件复制
- 打开一个已有文件,读取完整内容,并写入到另外一个文件
# 1. 打开文件 file_read = open("README") file_write = open("README[复件]", "w") # 2. 读取并写入文件 text = file_read.read() file_write.write(text) # 3. 关闭文件 file_read.close() file_write.close()
大文件复制
打开一个已有文件,逐行读取内容,并顺序写入到另外一个文件
# 1. 打开文件 file_read = open("README") file_write = open("README[复件]", "w") # 2. 读取并写入文件 while True: # 每次读取一行 text = file_read.readline() # 判断是否读取到内容 if not text: break file_write.write(text) # 3. 关闭文件 file_read.close() file_write.close()
四、文件和目录的管理操作
- 在终端/文件浏览器、 中可以执行常规的文件/目录管理操作,例如:
- 创建、重命名、删除、改变路径、查看目录内容、……
- 在
Python
中,如果希望通过程序实现上述功能,需要导入os
模块。具体步骤如下:
- 导入os模块
import os • 1
- 使用
os
模块相关功能
os.函数名()
4.1 文件操作
序号 | 方法名 | 说明 | 示例 |
01 | rename | 重命名文件 | os.rename(源文件名, 目标文件名) |
02 | remove | 删除文件 | os.remove(文件名) |
4.2 目录(文件夹)操作
提示:文件或者目录操作都支持 相对路径 和 绝对路径
# 需求:在aa里面创建bb文件夹: 1. 切换目录到aa,2创建bb import os os.chdir('aa') os.mkdir('bb')
4.3 应用案例
需求:批量修改文件名,既可添加指定字符串,又能删除指定字符串。
- 步骤
- 设置添加删除字符串的的标识
- 获取指定目录的所有文件
- 将原有文件名添加/删除指定字符串,构造新名字
- os.rename()重命名
- 代码
import os # 设置重命名标识:如果为1则添加指定字符,flag取值为2则删除指定字符 flag = 1 # 获取指定目录 dir_name = './' # 获取指定目录的文件列表 file_list = os.listdir(dir_name) # print(file_list) # 遍历文件列表内的文件 for name in file_list: # 添加指定字符 if flag == 1: new_name = 'Python-' + name # 删除指定字符 elif flag == 2: num = len('Python-') # 7 new_name = name[num:] # 打印新文件名,测试程序正确性 print(new_name) # 重命名 os.rename(dir_name+name, dir_name+new_name)
五、总结
- 文件操作步骤
- 打开
文件对象 = open(目标文件, 访问模式)
操作
- 读
文件对象.read() 文件对象.readlines() 文件对象.readline()
- 写
文件对象.write()
- seek()
- 关闭
文件对象.close()
- 主访问模式
- w:写,文件不存在则新建该文件
- r:读,文件不存在则报错
- a:追加
- 文件和文件夹操作
- 重命名:os.rename()
- 获取当前目录:os.getcwd()
- 获取目录列表:os.listdir()