暑假Python基础整理 -- 文件及目录操作
基本文件操作
创建和打开文件
在Python中若要操作文件对象,需要先使用内置的 open()
函数实现。其语法格式如下:
file = open(filename[,mode[,buffering]])
file
:被创建的文件对象filename
:要创建或者打开文件的名称,需要使用单引号或双引号括起来,若打开文件在当前目录下,则可以直接写文件名,否则需要指定完整路径mode
:可选参数,用于指定文件的打开模式。默认为r
即只读模式buffering
:可选参数,用于指定读写文件的缓冲模式,若为0,则表示不缓存,若为1,则表示缓存;如大于1,则表示缓冲区的大小,默认为缓存模式
mode
的参数值及其说明
参数值 | 说明 | 文件必须存在 |
---|---|---|
r | 以只读模式打开文件,文件的指针将放置文件开头 | 是 |
rb | 以二进制格式打开文件,只读模式,指针放置开头,用于非文本文件 | 是 |
r+ | 打开文件后,可以读取文件内容,也可以写入新的内容覆盖掉原有内容(从头开始覆盖) | 是 |
rb+ | 以二进制格式打开文件,读写模式,指针放置开头,用于非文本文件 | 是 |
w | 以只写模式打开文件 | 否 |
wb | 以二进制格式打开文件,只写模式,用于非文本文件 | 否 |
w+ | 打开文件后,先清空内容,对空文件有读写权限 | 否 |
wb+ | 以二进制格式打开文件,读写模式,用于非文本文件 | 否 |
a | 以追加模式打开文件,若文件存在,文件指针放置于末尾,否则 | 否 |
ab | 二进制格式打开文件,追加模式,指针放置末尾 | 否 |
a+ | 以读写模式打开文件,指针放置末尾 | 否 |
ab+ | 二进制格式打开文件,追加模式,指针放置末尾 | 否 |
open()
方法经常实现以下几个功能:
- 打开一个不存在的文件时先创建该文件
- 以二进制形式打开文件,如图片、音视频文件等
- 打开文件时指定编码方式,默认
GBK
编码格式,若打开文件与编码不符将会抛出UnicodeDecodeError
异常信息
关闭文件
打开文件后,需要及时关闭文件,以免对文件造成破坏。如关闭文件名为file
的文件语法如下:
file.close()
close()
方法先刷新缓冲区中还未写入的信息,然后关闭文件
打开文件使用with
语句
使用with
语句可以实现无论是否抛出异常都将保证with
语句执行完毕后关闭已经打开的文件,其语法格式如下:
with expression as target:with_body
expression
:用于指定一个表达式,这里可以是open()
函数target
:指定一个变量,并将expression
的结果保存在该变量中with_body
:用于指定with
语句体
写入文件内容
Python的文件对象提供了write()
方法,可以向文件写入内容,write()
方法如下:
file.write(string)
其中file
为文件对象,string
为需要写入的字符串。
调用
write()
方法向文件写入内容的前提是,在打开文件时,指定的打开模式为w
或者a
,否则将会抛出异常(没有写入权限)。
注意:在写入文件后一定要调用close()方法关闭文件,否则,写入的内容不会被保存到文件中。这是因为,当我们在写入文件内容时,操作系统不会立即把数据写入磁盘中,而是先缓存起来,只有当调用close()方法时,操作系统才会保证把没有写入的数据全部写入磁盘中。另外,在向文件写入内容后,如果不想马上关闭文件,也可以调用文件对象提供的flush()方法,把缓冲区的内容写入文件中,这样也能保证将全部信息写入文件。
除了write()
方法外,Python还提供了另一种写入方法,即writelines()
方法,可以实现把字符串列表写入文件,但是不添加换行符。
读取文件
读取指定字符
文件对象体提供了read()
方法读取指定个数的字符。其语法格式如下:
file.read([size])
file
:打开的文件对象size
:可选参数,用于指定要读取的字符个数,若省略,则一次性读取所有内容
调用
read()
方法读取文件内容的前提是,打开文件时,指定的打开模式为r
或者r+
,否则,将抛出异常信息。
使用read(size)
方法读取文件时,是从文件的开头读取的。若要读取部分内容,可以先使用文件对象的seek()
方法将文件的指针移动到新的位置处,然后使用read(size)
方法进行读取,其语法格式如下:
file.seek(offset[,whence])
file
:表示已打开的文件对象offset
:用于指定移动的字符个数,其具体位置与whence
相关whence
:用于指定从什么位置开始计算,如果值为0,则表示从头开始计算;如果值为1,则表示从当前位置开始计算,如果值为2,则表示从文件尾开始计算。默认为0.
对于
whence
参数,如果在打开文件时未使用b模式,则只允许从文件头开始计算相对位置。offset
的值按一个汉字占两个字符、英文和数字都占一个字符计算的,这与read(size)
方法不同。
例如:若要读取从第10个字符开始读取5个字符,示例代码如下:
with open('message.txt','r') as file:file.seek(10)string = file.read(5)print(string)
读取一行
文件对象提供了readline()
方法用于每次读取一行数据,其语法格式如下:
file.readline()
读取全部行
文件对象提供了readlines()
方法用于获取全部行,返回值为一个字符串列表,其语法格式如下:
file.readlines()
目录操作
os
和 os.path
模块
通过 os
模块提供的通用变量,可获取与系统有关的信息。常用的变量有以下几个:
name
:用于获取操作系统linesep
:获取当前操作系统上的换行符sep
:用于获取当前操作系统使用的路径分隔符
os
模块还提供了一些操作目录的函数,如:
函数 | 说明 |
---|---|
getcwd() | 返回当前的工作目录 |
listdir(path) | 返回指定路径下的文件和目录信息 |
mkdir(path[,mode]) | 创建目录 |
makedirs(path1/path2...[,mode]) | 创建多级目录 |
rmdir(path) | 删除目录 |
removedirs(path1/path2) | 删除多级目录 |
chdir(path) | 把path设置为当前工作目录 |
walk(top[,topdown[,onerror]]) | 遍历目录树,该方法返回一个元组,包括所有路径名、所有目录列表和文件列表3个元素 |
os.path
模块也提供了一些操作目录的函数,如:
函数 | 说明 |
---|---|
abspath(path) | 用于获取文件或目录的绝对路径 |
exists(path) | 用于判断目录或者文件是否存在,bool型 |
join(path,name) | 将目录与目录或者文件名拼接起来 |
splitext() | 分离文件名和扩展名 |
basename(path) | 从一个目录中提取文件名 |
dirname(path) | 从一个路径中提取文件路径,不包括文件名 |
isdir(path) | 用于判断是否为有效路径 |
路径
当前工作目录是指当前文件所在目录的目录。在Python中通过getcwd()
函数获取当前工作目录。如:
import os
print(os.getcwd())
相对路径依赖于当前工作目录,即在当前目录下的其他文件或子路径下的文件都可以通过[子路径名/...]/文件
方式访问。假设在D:file\code
目录下存在info
子目录,子目录下存在demo.txt
文件。现在要使用open()
函数将demo.txt
文件打开,则可以使用下述代码:
with open("info/demo.txt",'r') as f:message = f.read()
而绝对路径的方式如下所示:
with open("D:file/code/info/demo.txt",'r') as f:message = f.read()
在指定文件路径时,需要对路径中的
\
使用\\
进行转义操作,或者将\
替换为/
,若不想修改\
,也可以在路径字符串前加一个r
。
若要将两个或者多个路径拼接到一起组成一个新的路径,可以使用os.path
模块的join()
函数来实现,其具体语法如下:
os.path.join(path1[,path2,path3...])
path1
、path2
等参数代表路径,若该参数中不存在绝对路径,那么最后拼接的结果为一个相对路径。该过程不会检测路径是否存在。
在使用
join()
函数拼接时,若存在多个绝对路径,那么将以最靠右侧的绝对路径为主,并且该路径之前的参数都将忽视。
判断目录是否存在
当需要判断路径是否存在时,可以使用os.path
模块提供的exists()
函数,该函数除了可以判断目标是否存在,还可以判断文件是否存在。用法如下:
import os
os.path.exists(path)
path
为需要判断的路径,绝对或相对路径任意,返回值为bool
类型。
创建目录
Python中的os
模块提供了两个创建目录的方式:
- 创建一级目录
os.mkdir()
- 创建多级目录
os.makedirs()
创建一级目录
创建一级目录表示一次只能创建一级目录,可以通过os.mkdir()
实现,若该目录上级不存在,则抛出FileNotFoundError
异常信息。其语法如下:
os.mkdir(path,mode=0o777)
path
:用户指定要创建的目录,绝对或相对路径任意mode
:用于指定数值模式,默认值为0o777
,该参数非Unix系统将被忽视或无效。
创建多级目录
可以通过os.makedirs()
实现创建多级目录,该函数通过采用递归的方式创建目录。其语法如下:
os.mkdir(path,mode=0o777)
path
:用户指定要创建的目录,绝对或相对路径任意mode
:用于指定数值模式,默认值为0o777
,该参数非Unix系统将被忽视或无效。
删除目录
删除目录可以使用os
模块的rmdir()
函数来实现,只有当前要删除的文件为空时才生效,其语法如下 :
import os
os.rmdir(path)
若目录不存在,将抛出FileNotFoundError
异常信息,因此该函数可以于exists()
函数联合使用。
若要删除非空目录,需要使用Python内置模块
shutill
的rmtree()
函数实现。
遍历目录
对指定的目录下的全部目录及文件运行一遍。在Python中,os
的walk()
函数提供了遍历目录的功能,其语法格式如下:
import os
os.walk(top[,topdown][, onerror][, followlinks])
top
:用于指定要遍历内容的根目录topdown
:可选参数,指定遍历列表的顺序,True
表示自上而下遍历(先遍历根目录),False
表示自下而上遍历(先遍历最后一级子目录),默认为True
onerror
:可选参数,指定错误处理方式,默认为忽略,若不想默认,可自行采用函数。followlinks
:可选参数,默认情况下,walk()
函数不会向下转换成解析到目录的符号链接,将该函数值设置为True
,表示用于指定在支持的系统上访问由符号链接指向的目录。- 返回值:返回一个包含三个元素(
dirpath
、dirnames
、filenames
)的元组生成器对象。其中dirpath
表示当前遍历的路径,dirnames
表示当前路径下包含的子目录,是一个列表,filenames
表示当前路径下包含的文件,是一个列表。
walk()
函数只在UNIX和Windows系统有效
高级文件操作
os
模块提供的与文件相关的函数及其说明如表:
函数 | 说明 |
---|---|
access(path,accessmode) | 获取文件访问权限(读取/写入/执行权限),值为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指定的文件 |
在使用
rename()
函数重命名目录时,只能修改最后一级的目录名称,否则将抛出异常
获取文件基本信息
在Python中,可以通过os
模块的stat()
函数获取文件的基本信息。其格式语法如下:
import os
print(os.stat(path))
原文地址: 暑假Python基础整理 – 文件及目录操作