7.1.6 文件的重命名

os模块的函数rename()可以对文件或目录进行重命名。下面这段代码演示了文件重命名的操作。如果当前目录存在名为hello.txt的文件,则重命名为hi.txt;如果存在hi.txt的文件,则重命名为hello.txt。


01     # 修改文件名
02     import os
03     li = os.listdir(".")
04     print (li)
05     if "hello.txt" in li:
06         os.rename("hello.txt", "hi.txt")
07     elif "hi.txt" in li:
08         os.rename("hi.txt", "hello.txt")

【代码说明】

·第3行代码调用listdir()返回当前目录的文件列表,其中“.”表示当前目录。

·第4行代码输出当前目录包含的文件,rename_file.py是本段程序的文件。输出结果如下所示。


['rename_file.py', 'hello.txt']

·第5行代码判断当前目录中是否存在文件hello.txt。如果存在,则把hello.txt重命名为hi.txt。

·第7行代码判断当前目录中是否存在文件hi.txt。如果存在,则把hi.txt重命名为hello.txt。

在实际应用中,通常需要把某一类文件修改为另一种类型,即修改文件的后缀名。这种需求可以通过函数rename()和字符串查找的函数实现。下面这段代码把后缀名为html的文件修改为以htm为后缀名的文件。


01     # 修改后缀名
02     import os                      # 导入os模块
03     files = os.listdir(".")
04     for filename in files:
05         pos = filename.find(".")
06         if filename[pos + 1:] == "html":
07             newname = filename[:pos + 1] + "htm"
08             os.rename(filename,newname)

【代码说明】

·第3行代码调用listdir(),返回当前目录的文件列表files。这样可以对当前目录中的多个文件进行重命名。

·第4行代码循环列表files,获取当前目录中的每个文件名。

·第5行代码调用find()查找文件名中“.”所在的位置,并把值赋给变量pos。

·第6行代码判断文件的后缀名是否为html。pos+1表示“.”后的位置。

·第7行代码重新组合新的文件名,以htm作为后缀名。filename[:pos+1]表示从filename的开头位置到“.”这段分片。

·第8行代码调用rename重命名文件。

为获取文件的后缀名,这里先查找“.”所在的位置,然后通过分片filename[pos+1:]截取后缀名。这个过程可以使用os.path模块的函数splitext()实现。splitext()返回1个列表,列表中的第1个元素表示文件名,第2个元素表示文件的后缀名。修改后的代码如下所示。


01     import os
02     files = os.listdir(".")
03     for filename in files:
04         li = os.path.splitext(filename)
05         if li[1] == ".html":
06             newname = li[0] + ".htm"
07             os.rename(filename,newname)

【代码说明】

·第4行代码调用splitext()对文件名进行解析,返回文件名和后缀名组成的列表。

·第5行代码,通过li[1]判断文件是否以html结尾。

·第6行代码重新组合新的文件名,li[0]表示不带后缀的文件名。

glob模块用于路径的匹配,返回符合给定匹配条件的文件列表。glob模块的主要函数就是glob(),该函数返回符合同一匹配条件的多个文件。上面的例程需要判断文件是否为html后缀,也可以使用glob()直接匹配文件名称。


glob.glob("*.html")

【代码说明】该行代码返回html格式的文件。输出结果如下所示。


['hello.html', 'hi.html']

glob可以对路径做更多的匹配。例如,下面这段代码可以匹配C盘中以w开头的目录中所有的文本文件。


glob.glob("c:\\w*\\*.txt")

注意 glob()的参数满足正则表达式的语法。