基于Python的文件批量重命名(附详细过程解读)

基于Python的文件批量重命名(附详细过程解读)

0.闲言碎语

hi ~

欢迎关注公众号“壹贰叁言”!

啥都写,图一乐哈哈!

1.前因后果

前几日,我在用arcgis处理一些数据后,发现文件的命名不对,需要对文件进行重命名处理,
重命名第一个时
“啊,就这?”
处理第三个时
“嗯,还行”
处理完第一个文件夹时
“我
********”
这时候,我脑海里突然想起了在远方隔离的龙哥,有次聊天他问我
“Python是不是可以做比如文件批量重命名这种”
我的回答是
“Python会,我不会”
现在,
“能搞”

2.需求

我现在有一份数据,经过arcgis处理后,一共分为了13个文件夹,每个文件夹都包含了6个不同的文件,这6个文件又分别包含了7种不同格式的数据,数据格式是dbf、prj、sbn、sbx、shp、shx、xml。可见图2.1和图2.2
在这里插入图片描述

                                图2.1 13个文件夹

在这里插入图片描述

                                图 2.2 文件

图2.1中的文件夹的名字是化学元素的名字,图2.2中的文件名字是6个村的名字,现在我想要的将各个村的名字格式统一,每个村的名字后面加上所属元素如:A村_B,A村_Ca…同时,7种数据格式文件我只需要dbf、prj、shp、shx四种,其余的三种我希望可以被删除。

成功的格式如图2.3

在这里插入图片描述

                                                 图 2.3

3.Python代码

编码格式如不规范欢迎大佬指正

import os
import sys

# 定义一个名字叫做rename的函数
def rename(filePath):
    """
    批量重命名指定路径下的'.dbf', '.prj', '.shp', '.shx'格式的文件,重命名格式:文件_文件夹名字,
    并删除'.sbn', '.sbx', '.xml'格式的文件
    :param filePath: 文件夹的路径
    :return: 
    """
    # 文件筛选条件
    condition1 = ('.dbf', '.prj', '.shp', '.shx')
    condition2 = ('.sbn', '.sbx', '.xml')
    
    # os.walk 查找文件
    for root, dirs, files in os.walk(filePath):
        # 文件夹名字
        mark = root.split('\\')[-1]

        # for循环遍历文件名字
        for fileName in files:
            if fileName != sys.argv[0]:
                if fileName.endswith(condition1):
                    os.rename(os.path.join(root, fileName), os.path.join(root, fileName.split('.')[0] + '_' +
                                                                         mark + '.' + fileName.split('.')[-1]))
                    print(fileName, '已经重命名成功了,乖乖,新名字是:', fileName.split('.')[0] + '_' + mark + '.'
                          + fileName.split('.')[-1])
                if fileName.endswith(condition2):
                    delFileName = os.path.join(root, fileName)
                    os.remove(delFileName)
                    print(delFileName, '已经成功被移除。')

if __name__ == '__main__':
    filePath = r'G:\村级裁剪'
    rename(filePath)

4.代码详解

本次所使用到的Python包主要是OS,是Python自带的包

第1、2行代码主要是引入OS包和sys包

import os
import sys

在本次中写了一个函数,函数主体包含了第5-32行代码,其功能是

批量重命名指定路径下的'.dbf', '.prj', '.shp', '.shx'格式的文件,重命名格式:文件_文件夹名字,
并删除'.sbn', '.sbx', '.xml'格式的文件

condiition1和condition2是我命名的两个条件,将7个格式分为了我想要的两类,

# 文件筛选条件
condition1 = ('.dbf', '.prj', '.shp', '.shx')
condition2 = ('.sbn', '.sbx', '.xml')

两个condition的类型是元组,用元组的原因是我在后面使用了endswith函数,对应于第24行代码,endswith的功能是判断是否以某个指定后缀结尾,而我希望可以判断多个指定后缀,其支持使用元组,如果想使用列表,可以使用关键词any,如

if any(fileName.endswith(condition) for condition in conditions)

需要清楚的是此时的conditions应是一个列表,如[’.dbf’, ‘.prj’, ‘.shp’, ‘.shx’]

第17行使用了函数os.walk()

for root, dirs, files in os.walk(path):

root 表示正在访问的当前目录
dirs 表示root当前目录下包含的子目录
files 表示root当前目录下包含的文件

第19行是取文件夹的名字,

mark = root.split('\\')[-1]

因为取到的root是一个路径,格式如下:

G:\村级裁剪\B

我目前能想到的取文件夹名字的方法是利用split函数,按照“\”进行分割(之所以用’\’是因为转义字符),这样取分割后的最后一个元素就是文件夹名字了,如果有大佬知道别的方法请指导学习一下。

第22行是一个for循环,遍历文件的名字,第22和23都是if判断语句,endswith作用可参考上面提到的,第25行是最重要的语句os.rename(src, dst)。

os.rename是用于命名文件或者目录,其中src是要修改的文件名,dst是修改后的文件名

os.path.join()作用是把文件路径和文件名组合在一起,这样os.rename()才能找到文件的位置

# for循环遍历文件名字
for fileName in files:
    if fileName != sys.argv[0]:
        if fileName.endswith(condition1):
            os.rename(os.path.join(root, fileName), os.path.join(root, fileName.split('.')[0] + '_' +
                                                                 mark + '.' + fileName.split('.')[-1]))
            print(fileName, '已经重命名成功了,乖乖,新名字是:', fileName.split('.')[0] + '_' + mark + '.'
                  + fileName.split('.')[-1])

需要注意的是文件的新名字是我用字符串拼接成的。

第29行-32行是判断文件是否满足第二个条件,如果满足则将其移除,最重要的语句是os.remove()

if fileName.endswith(condition2):
    delFileName = os.path.join(root, fileName)
    os.remove(delFileName)
    print(delFileName, '已经成功被移除。')

第35行-37行是一个主函数,其中filePath是存放文件的路径,rename()即是调用我写好上面的rename函数。

运行后的页面如图4.1所示,

在这里插入图片描述

                                      图4.1

整体其实不到一秒,这样就可以大大增加摸鱼的时间了
在这里插入图片描述

  • 17
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值