hi ~
欢迎关注公众号“壹贰叁言”!
啥都写,图一乐哈哈!
前几日,我在用arcgis处理一些数据后,发现文件的命名不对,需要对文件进行重命名处理,
重命名第一个时
“啊,就这?”
处理第三个时
“嗯,还行”
处理完第一个文件夹时
“我********”
这时候,我脑海里突然想起了在远方隔离的龙哥,有次聊天他问我
“Python是不是可以做比如文件批量重命名这种”
我的回答是
“Python会,我不会”
现在,
“能搞”
我现在有一份数据,经过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
编码格式如不规范欢迎大佬指正
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)
本次所使用到的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