使用os模块实现批量修改指定文件名

本文介绍了如何使用Python的os模块进行文件和目录操作,重点讲解了批量修改文件名的方法,包括添加统一后缀、按文件类型修改以及自定义前缀或内容替换,并提到了正则表达式在文件名处理中的应用。

【特别说明】Python入门实战练习系列内容,主要取材于开课吧-6小时大数据入门实战免费体验课程。在这里整理成个人学习笔记,仅供参考。

1.os模块常用操作方法

os模块提供了非常丰富的方法来处理文件和目录。

(1)os.getcwd():获取当前文件的工作路径

(2)os.name:判断当前使用的平台
若输出结果为posix,则表示当前为Linux平台,如果输出结果为nt,则表示使用的是windows平台。

(3)os.mkdir(path):创建文件夹

# 在当前路径下创建了一个名叫Python的文件夹
import os
os.mkdir('./Python文档')

涉及到路径问题,就需要用到os中的path模块,os.path模块主要用于文件的属性获取。

(4)os.path.exists(path):判断该路径下的文件是否存在

(5)os.path.abspath(path):返回该文件的绝对路径
绝对路径是指,从根目录开始的路径,如mac是从/Users/…开始的。

(6)os.path.isdir(path):判断给定的路径是否是文件夹
(7)os.path.isfile(path):判断给定的路径是否是文件

os.path.isdir('./Python文档')     #True
os.path.isfile('./Python文档')    #False
os.path.isfile('./os模块.ipynb')   #True

(8)os.path.splitext(path):拆分文件名,分离文件名与扩展名

os.path.splitext('os模块.ipynb')
# 以元组的形式呈现 ('os模块','.ipynb')

os.path.splitext('/Users/nichole/Desktop/os模块.ipynb')
# ('/Users/nichole/Desktop/os模块','.ipynb')

(9)os.path.getctime(path):获取文件创建的时间

result = os.path.getctime('/Users/nichole/Desktop/os模块.ipynb')
result
# 1597399882.84969

运行之后得到的数字,在代码中叫做时间戳,实际代表的是1970-01-01 00:00:00到当前的秒数

想要得到我们将时间戳改成指定的时间,可如下操作:

import time
timearr = time.localtime(result)
mytime = time.strftime('%Y-%m-%d %H:%M:%S',timearr)
mytime
# 2020-08-14 18:11:22

(10)os.listdir(path):获取指定的文件夹中所有文件或文件夹的名字的列表

import os
# 在桌面创建文件夹
os.mkdir('/Users/nichole/Desktop/小皮球')

# 在小皮球📁中再创建三个文件夹:学习、实习、生活
os.mkdir('/Users/nichole/Desktop/小皮球/学习')
os.mkdir('/Users/nichole/Desktop/小皮球/实习')
os.mkdir('/Users/nichole/Desktop/小皮球/生活')

# 返回小皮球📁中文件夹名的列表
os.listdir('/Users/nichole/Desktop/小皮球')
# ['生活', '学习', '实习']

(11)os.rename(oldpath, newpath):修改文件名
(12)os.path.join(path1, newpath):路径拼接

# 将小皮球文件夹下的实习文件夹改名成工作文件夹
oldpath = os.path.join('/Users/nichole/Desktop/小皮球', '实习')
newpath = os.path.join('/Users/nichole/Desktop/小皮球', '工作')
os.rename(oldpath, newpath)

2.案例:批量修改指定文件名

现在想要通过程序来实现文件修改自动化,主体步骤大致如下:

1.传入一个指定的路径
2.获取该路径下的文件名
3.修改文件名

2.1 将指定文件夹中所有内容添加同一后缀

首先,我们先进行一个加统一后缀的批量处理,具体过程如下:

# 批量修改文件名字的函数
def filename_modify(target_dir,addstr=''):
    # 1.判断路径是否存在
    if os.path.exists(target_dir)==False:
        raise Exception('该路径不存在')
    # 2.遍历文件夹中的文件名
    for file in os.listdir(target_dir):
        # 2.1 分割文件名和拓展名
        filename = os.path.splitext(file)[0]
        fileExpand = os.path.splitext(file)[1]
        # 2.2 将所有文件的后面添加指定后缀addstr
        newname = filename + addstr + fileExpand
        # 2.3 修改名字
        oldpath = os.path.join(target_dir, file)
        newpath = os.path.join(target_dir, newname)
        os.rename(oldpath, newpath)
 
# 例:将小皮球文件夹下的所有文件名均加上‘-Nichole’的后缀
filename_modify('/Users/nichole/Desktop/小皮球',addstr='-Nichole')
2.2 文件修改类型的多样化

实际中,可能遇到的场景是,我们只想修改文件夹中文件的名字,对于其中文件夹的名字不做变动。那么,可以在 2.1 分割文件名和拓展名后添加判断语句。至少有两种方式,如下:

 # 方式一:直接判断给定的路径是否是文件夹,若返回True,则continue结束本次循环
if os.path.isdir(os.path.join(targrt_dir,file)):
    continue
# 方式二:通过判断是否有文件拓展名来判断给定的路径是否是文件夹,若拓展名为空,表明是文件夹
if fileExpand == '':
    continue

进一步来看,如果我们只想修改excel文件,那么我们就需要接着添加一个判断语句,以此来筛选出待修改的文件类型。

这个时候,我们可以在函数中设置一个参数,而这个参数值即代表的是想要修改的文件类型,具体如下:

def filename_modify(target_dir,addstr='',filetype=None):

文件类型参数默认为None,若有指定的文件类型filetype != None,但文件拓展名中不存在该类型文件filetype not in fileExpand,则结束本次循环,以此达到一个过滤未指定类型文件的效果。

if filetype != None and filetype not in fileExpand:   
    continue
2.3 文件修改内容的多样化

实际中,可能有时我们并不想添加后缀,而是想在所有文件的前面加上一个前缀;或者我们并不想只是添加内容,而是想将文件内容进行一个替换,又该如何操作呢?

此时,为了代码的适用性更广,就可以在函数中自行设置相关参数,对应设定一个判断语句,如下:

import re
def filename_modify(target_dir,addstr='',filetype=None,position='end',oldstr='',newstr=''):
    # 1.判断路径是否存在
    # 2.遍历文件夹中的文件名
        # 2.1 分割文件名和拓展名
        # 2.2 判断是否为文件夹、文件类型是否正确
        # 2.3 判断添加的位置
        if position == 'end':
            newname = filename + addstr + fileExpand
        elif position == 'head':
            newname = addstr + filename + fileExpand
        elif position == 'replace':
            pattern = re.findall(oldstr,filename)
            for value in pattern:
                filename = filename.replace(value,newstr)
            newname = filename + fileExpand
        # 2.4 修改名字

在上述代码中,用到了re模块。

re模块,也是Python内置模块中的一个,主要用于支持正则表达式的使用。而所谓正则化表达式,就是一堆特殊的符号组成的规则,通过这个规则可以实现对字符串的匹配或过滤。这里,就不展开介绍了。

最后,给大家提供一个正则表达式语法的学习链接https://deerchao.cn/tutorials/regex/regex.htm,感兴趣的小伙伴可以自行进行学习哈~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值