第7章 文件操作
7.1 文件的基本概念
在计算机中,文件是存储在磁盘上的数据集合。文件可以包含各种类型的数据,如文本、图像、音频、视频或程序代码。
文件系统通过文件名和文件路径来定位和管理文件。文件名通常包含文件的名称和扩展名(例如 .txt 表示文本文件,.jpg 表示图像文件)。文件路径可以是绝对路径或相对路径。
在编写程序的时候,数据是以二进制的形式存储在内存的,将数据写到磁盘文件的过程称之为持久化。
7.1.1 文件的分类
1)纯文本文件
有统一的编码,可以被看做存储在磁盘上的长字符串。常见编码格式有 ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16 等。
2)二进制文件
没有统一的字符编码,直接由 0 与 1 组成。如图片文件(jpg、png),视频文件(avi)等。
7.1.2 文件的路径
1)相对路径
从当前位置到指定位置的路径。如:./hello_world.py。./ 代表当前路径,../ 代表上一级路径。
2)绝对路径
从根目录到指定位置的路径。如:E:/Hello/hello.py。
7.2 文件的打开与关闭
1)打开文件
使用 open() 打开或创建文件,该方法执行完毕之后返回的是一个 file 对象。
常用形式:
f = open("test.txt", "w")
| 模式 | 说明 |
|---|---|
r | 只读,文件若不存在会报错。默认此模式 |
w | 写入,写入前清空原有数据。文件不存在会创建文件 |
a | 追加写入,在原有数据后追加,文件不存在会创建文件 |
x | 创建新文件并写入,文件若已存在会报错 |
b | 以二进制打开。一般用于非文本文件如图片等 |
t | 以文本模式打开,默认此模式 |
+ | 能读能写 |
完整形式:
open(
file, # 文件路径
mode="r", # 文件打开模式
buffering=-1, # 缓冲
encoding=None, # 文本编码方式,一般用utf8
errors=None, # 报错级别
newline=None, # 区分换行符
closefd=True, # 传入的file参数类型
opener=None, # 设置自定义开启器
)
2)关闭文件
f.close()
7.3 文件读写
7.3.1 写数据
# 打开文件
f = open("test.txt", "w")
# 写入数据
f.write("hello world\n")
f.write("nihao python\n")
# 关闭文件
f.close()
7.3.2 读数据
1)read
read([size]) 可以从文件中读取数据,size 表示要读取的数据长度(单位是字节),如果没有传入 size 则读取文件中所有的数据。
f = open("test.txt", "rt")
print(f.read())
f.close()
2)readline
readline([size]) 可以从文件中读取整行数据。
f = open("test.txt", "rt")
print(f.readline())
f.close()
3)readlines
readlines([size]) 读取所有行并返回列表。
f = open("test.txt", "r", encoding="utf-8")
print(f.readlines())
f.close()
7.4 常用函数
| 函数 | 说明 |
|---|---|
file.seek(offset[, from]) | 移动偏移量并返回新的绝对位置 |
file.tell() | 返回当前偏移量 |
file.truncate([size]) | 从开头开始截断文件 |
file.writelines(seq) | 将序列中字符串写入文件 |
file.readable() | 如果可以读取文件则返回 True |
file.writeable() | 如果可以写入文件则返回 True |
file.seekable() | 如果文件支持随机访问则返回 True |
os.rename(old, new) | 重命名文件 |
os.remove(file) | 删除文件 |
os.mkdir(dir) | 创建目录,不支持递归创建 |
os.makedirs(dir) | 递归创建目录 |
os.getcwd() | 获取当前路径 |
os.chdir(dir) | 进入指定目录 |
os.listdir(dir) | 获取目录下文件和目录列表 |
os.rmdir(dir) | 删除空目录 |
os.removedirs(dir) | 递归删除空目录 |
os.path.abspath(path) | 将相对路径转换为绝对路径 |
os.path.basename(path) | 获取路径中的文件名部分 |
os.path.dirname(path) | 获取路径中的目录部分 |
os.path.join(*paths) | 拼接多个路径 |
os.path.split(path) | 将路径分割为目录和文件名的元组 |
os.path.splitext(path) | 将路径分割为文件名和扩展名的元组 |
os.path.exists(path) | 判断路径是否存在 |
os.path.isfile(path) | 判断路径是否为文件 |
os.path.isdir(path) | 判断路径是否为目录 |
os.path.getsize(path) | 获取文件的大小(字节) |
os.path.getatime(path) | 获取文件的最后访问时间 |
os.path.getmtime(path) | 获取文件的最后修改时间 |
os.walk() 递归遍历目录:
import os
for root, dirs, files in os.walk(os.getcwd()):
print("当前路径:", root)
print("目录:", dirs)
print("文件:", files)
print()
7.5 案例:文件拷贝
def copyFile(source_file_path, dest_file_path):
source_file = open(source_file_path, 'rb')
dest_file = open(dest_file_path, 'wb')
content = source_file.read(1024)
while content:
dest_file.write(content)
content = source_file.read(1024)
source_file.close()
dest_file.close()
copyFile("D:/mv.png", "E:/mv.png")
优化:这种方式可以不用读取整个文件,减小内存压力。