Python(三十七)python文件操作常用模块(二)

84 阅读8分钟

一:Python pathlib模块用法详解

pathlib 模块中包含的是一些类,它们的继承关系如图 1 所示。

微信截图_20220117174346.png

pathlib 模块的操作对象是各种操作系统中使用的路径(例如指定文件位置的路径,包括绝对路径和相对路径)。这里简单介绍一下图 1 中包含的几个类的具体功能:

1)      PurePath 类会将路径看做是一个普通的字符串,它可以实现将多个指定的字符串拼接成适用于当前操作系统的路径格式,同时还可以判断任意两个路径是否相等。注意,使用 PurePath 操作的路径,它并不会关心该路径是否真实有效。

2)      PurePosixPath 和 PureWindowsPath 是 PurePath 的子类,前者用于操作 UNIX(包括 Mac OS X)风格的路径,后者用于操作 Windows 风格的路径。

3)      Path 类和以上 3 个类不同,它操作的路径一定是真实有效的。Path 类提供了判断路径是否真实存在的方法。

4)      PosixPath 和 WindowPath 是 Path 的子类,分别用于操作 Unix(Mac OS X)风格的路径和 Windows 风格的路径。

 

PurePath 类为我们提供了以下 类属性和方法

类实例属性和实例方法名功能描述
PurePath.parts返回路径字符串中所包含的各部分。
PurePath.drive返回路径字符串中的驱动器盘符。
PurePath.root返回路径字符串中的根路径。
PurePath.anchor返回路径字符串中的盘符和根路径。
PurePath.parents返回当前路径的全部父路径。
PurPath.parent返回当前路径的上一级路径,相当于 parents[0] 的返回值。
PurePath.name返回当前路径中的文件名。
PurePath.suffixes返回当前路径中的文件所有后缀名。
PurePath.suffix返回当前路径中的文件后缀名。相当于 suffixes 属性返回的列表的最后一个元素。
PurePath.stem返回当前路径中的主文件名。
PurePath.as_posix()将当前路径转换成 UNIX 风格的路径。
PurePath.as_uri()将当前路径转换成 URL。只有绝对路径才能转换,否则将会引发 ValueError。
PurePath.is_absolute()判断当前路径是否为绝对路径。
PurePath.joinpath(*other)将多个路径连接在一起,作用类似于前面介绍的斜杠(/)连接符。
PurePath.match(pattern)判断当前路径是否匹配指定通配符。
PurePath.relative_to(*other)获取当前路径中去除基准路径之后的结果。
PurePath.with_name(name)将当前路径中的文件名替换成新文件名。如果当前路径中没有文件名,则会引发   ValueError。
PurePath.with_suffix(suffix)将当前路径中的文件后缀名替换成新的后缀名。如果当前路径中没有后缀名,则会添加新的后缀名。

 

具体的使用方法,我这里就不赘述了。请移步官方文档:

docs.python.org/zh-cn/3/lib…

 

 

二:Python os.path模块常见函数用法(实例+详细注释)

方法说明
os.path.abspath(path)返回 path 的绝对路径。
os.path.basename(path)获取 path 路径的基本名称,即 path 末尾到最后一个斜杠的位置之间的字符串。
os.path.commonprefix(list)返回 list(多个路径)中,所有 path 共有的最长的路径。
os.path.dirname(path)返回 path 路径中的目录部分。
os.path.exists(path)判断 path 对应的文件是否存在,如果存在,返回 True;反之,返回 False。和 lexists() 的区别在于,exists()会自动判断失效的文件链接(类似 Windows 系统中文件的快捷方式),而 lexists() 却不会。
os.path.lexists(path)判断路径是否存在,如果存在,则返回 True;反之,返回 False。
os.path.expanduser(path)把 path 中包含的   "~" 和 "~user" 转换成用户目录。
os.path.expandvars(path)根据环境变量的值替换 path 中包含的 "name""name" 和 "{name}"。
os.path.getatime(path)返回 path 所指文件的最近访问时间(浮点型秒数)。
os.path.getmtime(path)返回文件的最近修改时间(单位为秒)。
os.path.getctime(path)返回文件的创建时间(单位为秒,自 1970 年 1 月 1 日起(又称 Unix 时间))。
os.path.getsize(path)返回文件大小,如果文件不存在就返回错误。
os.path.isabs(path)判断是否为绝对路径。
os.path.isfile(path)判断路径是否为文件。
os.path.isdir(path)判断路径是否为目录。
os.path.islink(path)判断路径是否为链接文件(类似 Windows 系统中的快捷方式)。
os.path.ismount(path)判断路径是否为挂载点。
os.path.join(path1[, path2[, ...]])把目录和文件名合成一个路径。
os.path.normcase(path)转换 path 的大小写和斜杠。
os.path.normpath(path)规范 path 字符串形式。
os.path.realpath(path)返回 path 的真实路径。
os.path.relpath(path[, start])从 start 开始计算相对路径。
os.path.samefile(path1, path2)判断目录或文件是否相同。
os.path.sameopenfile(fp1, fp2)判断 fp1 和 fp2 是否指向同一文件。
os.path.samestat(stat1, stat2)判断 stat1 和 stat2 是否指向同一个文件。
os.path.split(path)把路径分割成 dirname 和 basename,返回一个元组。
os.path.splitdrive(path)一般用在 windows 下,返回驱动器名和路径组成的元组。
os.path.splitext(path)分割路径,返回路径名和文件扩展名的元组。
os.path.splitunc(path)把路径分割为加载点与文件。
os.path.walk(path, visit, arg)遍历path,进入每个目录都调用 visit 函数,visit 函数必须有 3 个参数(arg, dirname, names),dirname 表示当前目录的目录名,names 代表当前目录下的所有文件名,args 则为 walk 的第三个参数。
os.path.supports_unicode_filenames设置是否可以将任意 Unicode 字符串用作文件名。

示例:

from os import path
# 获取绝对路径
print(path.abspath("my_file.txt"))
# 获取共同前缀
print(path.commonprefix(['C://my_file.txt''C://a.txt']))
# 获取共同路径
print(path.commonpath(['http://guanchao.site''http://l.guanchao.site']))
# 获取目录
print(path.dirname('C://my_file.txt'))
# 判断指定目录是否存在
print(path.exists('my_file.txt'))

输出:

F:\camellia\python\testProject\my_file.txt
C://
http:
C://
False

 

三:Python fnmatch模块:用于文件名的匹配

fnmatch 模块主要用于文件名称的匹配,其能力比简单的字符串匹配更强大,但比使用正则表达式相比稍弱。。如果在数据处理操作中,只需要使用简单的通配符就能完成文件名的匹配,则使用 fnmatch 模块是不错的选择。

fnmatch 模块常用函数如下:

函数名功能
fnmatch.filter(names, pattern)对 names 列表进行过滤,返回 names 列表中匹配 pattern 的文件名组成的子集合。
fnmatch.fnmatch(filename, pattern)判断 filename 文件名,是否和指定 pattern 字符串匹配
fnmatch.fnmatchcase(filename, pattern)和 fnmatch() 函数功能大致相同,只是该函数区分大小写。
fnmatch.translate(pattern)将一个 UNIX shell 风格的 pattern 字符串,转换为正则表达式

 

fnmatch 模块匹配文件名的模式使用的就是 UNIX shell 风格,其支持使用如下几个通配符:

1)      *:可匹配任意个任意字符。

2)      ?:可匹配一个任意字符。

3)      [字符序列]:可匹配中括号里字符序列中的任意字符。该字符序列也支持中画线表示法。比如 [a-c] 可代表 a、b 和 c 字符中任意一个。

4)      [!字符序列]:可匹配不在中括号里字符序列中的任意字符。

示例:

import fnmatch
#filter()
print(fnmatch.filter(['dlsf''ewro.txt''te.py''youe.py'], '*.txt'))
#fnmatch()
for file in ['word.doc','index.py','my_file.txt']:
    if fnmatch.fnmatch(file,'*.txt'):
        print(file)
#fnmatchcase()
print([addr for addr in ['word.doc','index.py','my_file.txt','a.TXT'if fnmatch.fnmatchcase(addr, '*.txt')])
#translate()
print(fnmatch.translate('a*b.txt'))

输出:

['ewro.txt']
my_file.txt
['my_file.txt']
(?s:a.*b.txt)\Z

 

四:Python tempfile模块:生成临时文件和临时目录

tempfile 模块专门用于创建临时文件和临时目录

tempfile 模块中常用的函数如下所示:

tempfile 模块函数功能描述
tempfile.TemporaryFile(mode='w+b',   buffering=None, encoding=None, newline=None, suffix=None, prefix=None,   dir=None)创建临时文件。该函数返回一个类文件对象,也就是支持文件 I/O。
tempfile.NamedTemporaryFile(mode='w+b',   buffering=None, encoding=None, newline=None, suffix=None, prefix=None,   dir=None, delete=True)创建临时文件。该函数的功能与上一个函数的功能大致相同,只是它生成的临时文件在文件系统中有文件名。
tempfile.SpooledTemporaryFile(max_size=0,   mode='w+b', buffering=None, encoding=None, newline=None, suffix=None,   prefix=None, dir=None)创建临时文件。与 TemporaryFile 函数相比,当程序向该临时文件输出数据时,会先输出到内存中,直到超过 max_size 才会真正输出到物理磁盘中。
tempfile.TemporaryDirectory(suffix=None,   prefix=None, dir=None)生成临时目录。
tempfile.gettempdir()获取系统的临时目录。
tempfile.gettempdirb()与 gettempdir() 相同,只是该函数返回字节串。
tempfile.gettempprefix()返回用于生成临时文件的前缀名。
tempfile.gettempprefixb()与 gettempprefix() 相同,只是该函数返回字节串。

 

注意:表中有些函数包含很多参数,但这些参数都具有自己的默认值,因此如果没有特殊要求,可以不对其传参。

 

下面的程序以两种方式来创建临时文件:

1)      第一种方式是手动创建临时文件,读写临时文件后需要主动关闭它,当程序关闭该临时文件时,该文件会被自动删除。

2)      第二种方式则是使用 with 语句创建临时文件,这样 with 语句会自动关闭临时文件。

import tempfile
 # 创建临时文件
 fp = tempfile.TemporaryFile()
 print(fp.name)
 fp.write('两情若是久长时,'.encode('utf-8'))
 fp.write('又岂在朝朝暮暮。'.encode('utf-8'))
 # 将文件指针移到开始处,准备读取文件
 fp.seek(0)
 print(fp.read().decode('utf-8')) # 输出刚才写入的内容
 # 关闭文件,该文件将会被自动删除
 fp.close()
 # 通过with语句创建临时文件,with会自动关闭临时文件
 with tempfile.TemporaryFile() as fp:
     # 写入内容
     fp.write(b'I Love Python!')
     # 将文件指针移到开始处,准备读取文件
     fp.seek(0)
     # 读取文件内容
     print(fp.read()) # b'I Love Python!'
 # 通过with语句创建临时目录
 with tempfile.TemporaryDirectory() as tmpdirname:
     print('创建临时目录', tmpdirname)

输出:

C:\Users\camellia\AppData\Local\Temp\tmpfq__m591
两情若是久长时,又岂在朝朝暮暮。
b'I Love Python!'
创建临时目录 C:\Users\camellia\AppData\Local\Temp\tmpzckg2hbo

 

上面程序最后还创建了临时目录。由于程序使用 with 语句来管理临时目录,因此程序也会自动删除该临时目录。

 

以上大概就是 python 对 文件的操作,有好的建议,请在下方输入你的评论。