文件及目录操作
在变量、序列和对象中存储的数据总是暂时的,程序结束后就会丢失,为了长时间的保存程序中的数据,需要将程序中的数据保存到磁盘文件中
基本文件操作
在python中,想要操作文件需要先创建或者打开指定的文件并创建文件对象,可以通过内置的open()
函数实现
file:被创建的文件对象
filename:要创建或打开文件的文件名称,需要使用单引号或双引号括起来,如果要打开的文件夹和当前文件在同一个目录下,那么直接写文件名即可,否则需要指定完整路径
mode:可选参数,用于指定文件的打开模式,详细可见下表,默认的大佬模式为只读(r)
buffering:可选参数,用于指定读写文件的缓冲模式,值为0表达式不缓存,值为1表示缓存,如果大于1,则表示缓冲区的大小,默认为缓存模式
# 基本语法格式
file = open(name[, mode[, buffering]])
mode参数的参数值说明
值 | 说明 | 注意 |
---|---|---|
r | 以只读模式打开文件,文件的指针会放在文件的开头 | 文件必须存在 |
rb | 以二进制格式打开文件,并且采用只读模式,文件的指针将会放在文件的开头,一般用于非文本文件,如图片,声音等 | 文件必须存在 |
r+ | 打开文件后,可以读取文件内容,也可以写入新的内容覆盖原有内容(从文件开头进行覆盖) | 文件必须存在 |
rb+ | 以二进制格式打开文件,并且采用读写模式,文件的指针将会放在文件的开头,一般用于非文件文件,如图片,声音等 | 文件必须存在 |
w | 以只写模式打开 | 文件存在,则将其覆盖,否则创建新文件 |
wb | 以二进制格式打开文件,并且采用只写模式,一般用于非文本文件,如图片,声音等 | 文件存在,则将其覆盖,否则创建新文件 |
w+ | 打开文件后,先清空原有内容,使其变为一个空的文件,对这个空文件有读写权限 | 文件存在,则将其覆盖,否则创建新文件 |
wb+ | 以二进制格式打开文件,并且采用度读写模式,一般用于非文本文件,如图片,声音等 | 文件存在,则将其覆盖,否则创建新文件 |
a | 以追加模式打开一个文件,如果该文件已经存在,文件指针将放在文件的末尾(即新内容会被写入到已有内容之后),否则,创建新文件用于写入 | |
ab | 以二进制格式打开文件,并且采用追加模式,如果该文件存在,文件指针将放在文件的末尾(即新内容会被写入到已有内容之后),否则,创建新文件用于写入 | |
a+ | 以读写模式打开文件,如果该文件已经存在,文件指针将放在文件的末尾(即新内容会被写入到已有内容之后),否则,创建新文件用于读写 | |
ab+ | 以二进制格式打开文件,并且采用追加模式,如果该文件已经存在,文件指针将放在文件的末尾(即新内容会被希尔到已有内容之后),否则,创建新文件用于读写 |
打开文件并读取操作
D:python est1data.txt
:表示文件绝对路径,在此目录下创建一个data.txt文件,输入数据123456
使用open方法打开文件后,需及时进行关闭,以免对文件造成不必要的破坏
# 创建一个文件对象
file = open(r'D:python est1data.txt')
# 使用read方法读取文件内容,read中可以指定读取的字符个数
print(file.read(5))
# 关闭文件对象
file.close()
# 以只读模式打开二进制图片文件
image = open(r'D:python est1图像.jpg', mode='rb')
# 以二进制读取文件内容,将图片装换为二进制
print(image.read())
# 关闭文件对象
image.close()
使用with打开文件
打开文件后,要及时将其关闭,如果忘记关闭可能会带来意想不到的问题,另外,如果在打开文件时抛出了异常,那么将导致文件不能被及时关闭。为了更好的避免此类问题发生,可以使用python提供的with语句,从而实现在处理文件时,无论是否抛出异常,都能保证with语句执行完毕后关闭已经打开的文件
with语句的基本语法格式:
exprssion:用于指定一个表达式,这里可以是打开文件的open()函数
target:用于指定一个变量,并且将expression的结果保存到该变量中
with-body:用于指定with语句体,其中可以是执行with语句后相关的一些操作语句,如果不想执行任何语句,可以直接使用pass语句代替
with expression as target:
with-body
# 实例
with open(r'D:python est1data.txt') as file:
print(file.read())
写入文件内容
python文件对象提供了write()方法,可以向文件中写入内容
向文件中添加不同格式的内容时,需使用encoding指定编码格式
# 创建对象追加文件内容
file = open(r'D:python est1data.txt', mode='a+')
# 追加789
file.write('789')
# 关闭文件操作
file.close()
# 使用with追加文字内容,需指定编码格式
with open(r'D:python est1data.txt', mode='a+', encoding='utf-8') as file1:
file1.write('追加写入')
注意点:使用创建对象方法写入时,在写入后要调用close()方法关闭文件,否则写入的内容不会保存到文件中,这是因为当我们子啊写入文件内容时,操作系统不会立刻把数据写入磁盘。而是先缓存起来,只有调用close()方法时,才能成功的把数据写入文件中
从指定位置读取内容
python提供了seek()方法,用于指定位置读取文件内容
file:已经打开的文件对象
offset:用于指定移动的字符个数,其具体位置与whence参数有关
whence:用于指定从什么位置开始计算,值为0表示从文件头开始计算,值为1表示从当前位置开始计算,值为2表示从文件尾开始计算,默认为0
# seek()方法的基本语法格式
file.seek(offset[,whence])
实例:
file = open(r'D:python est1data.txt', mode='r', encoding='utf-8')
# 从位置3开始读取,0为从文件头开始计算
file.seek(3, 0)
# 从位置3开始读取,读取2个字符个数
print(file.read(2))
file.close()
读取一行与全部行
readline():读取一行文本
readlines():读取所有行,以列表中形式存储,每行以字符串形式为列表的一个元素
# 读取一行
with open(r'D:python est1data.txt', encoding='utf-8') as file:
print(file.readline())
# 读取全部行,效果等同于read()方法,但是返回的是一个字符串的列表
with open(r'D:python est1data.txt', encoding='utf-8') as file1:
print(file1.readlines())
目录操作
目录也称文件夹,用于分层保存文件。通过目录可以将不同的文件存在不同的目录下,也可以通过目录快速找到想要的文件。在python中,并没有提供直接操作目录的函数或者对象,而是需要通过内置的os和os.path模块实现
注意点:由于操作系统的差异性,在不同的操作系统中运行,可能会得到不同的结果
os和os.path模块
在python中,内置了os模块及子模块os.path用于对目录或文件进行操作。在使用os模块或者os.path模块时,需要先使用import语句将其导入,然后才可以应用它们提供的函数或者变量
# 导入os模块
import os
# 获取操作系统类型
print(os.name)
# 获取当前操作系统所使用的路径分隔符
print(os.sep)
# 获取当前文件路径
print(os.getcwd())
os模块提供的与目录相关的函数
函数 | 说明 |
---|---|
getcwd() | 返回当前的工作目录 |
listdir(path) | 返回指定路径下的文件和目录信息 |
mkdir(path[,mode]) | 创建目录 |
mkdirs(path1/path2……[,mode]) | 创建多级目录 |
rmdir(path) | 删除目录 |
removedis(path1/path2……) | 删除多级目录 |
chdir(path) | 把path设置为当前工作路径 |
walk(top[,topdown[,onerror]]) | 遍历目录树,该方法返回一个元组,包括所有路径名,所有目录列表和文件列表3个元素 |
os.path模块提供的与目录相关的函数
函数 | 说明 |
---|---|
abspath(path) | 用于获取文件或目录的绝对路径 |
exists(path) | 用于判断目录或者文件是否存在,如果存在则返回True,否则返回False |
join(path,name) | 将目录与目录或者文件名拼接起来 |
splitext() | 分离文件名和扩展名 |
basename(path) | 从一个目录中提取文件名 |
dirname(path) | 从一个路径中提取文件路径,不包括文件名 |
isdir(path) | 用于判断是否为有效路径 |
高级文件操作
函数 | 说明 |
---|---|
assess(path,accessmode) | 获取对文件是否有指定的访问权限(读取/写入/执行权限)assessmode的值是R_OK(读取)、W_OK(写入)、X_OK(执行)或F_OK(存在)。如果有指定的权限,则返回1,否则返回0 |
chmod(path,mode) | 修改path指定文件的访问权限 |
remove(path) | 删除path指定的文件路径 |
rename(src,dst) | 将文件或目录src重命名为dst |
stat(path) | 返回path指定文件的信息 |
startfile(path[,operation]) | 使用关联的应用程序打开path指定的文件 |
获取文件的基本信息
import os
# 获取文件的基本信息,使用file接收
file = os.stat(r'D:python est1data.txt')
# 输出文件的基本信息
print(file)
# 获取文件的文件大小
print(file.st_size)
stat()函数返回的对象的常用属性
属性 | 说明 | 属性 | 说明 |
---|---|---|---|
st_mode | 保护模式 | st_dev | 设备名 |
st_ino | 索引号 | st_uid | 用户ID |
st_nlink | 硬链接号(被连接数目) | st_gid | 组ID |
st_size | 文件大小,单位为字节 | st_atime | 最后一次访问时间 |
st_mtime | 最后一次修改时间 | st_ctime | 最后一次状态变化的时间(系统不同返回结果也不同,例如,在windows操作系统名下返回的是文件的创建时间) |