python实现批量重命名且将相同前缀的文件压缩到一个压缩包中(将名称相同,扩展名不同的压缩成一个包)
1、python实现批量重命名
由于工作需要将从软件中导出的图层名称批量重命名,去掉最前面的“实例名称_””,采用python中的replace()函数即可实现
"""
只批量修改当前目录下的文件名称
"""
import os
import PySimpleGUI as sg
filePath = sg.popup_get_folder('请选择文件所在的文件夹位置')#这里利用PySimpleGUI模块来交互式选择文件夹所在的位置
list = os.listdir(filePath) #读取文件夹下所有的文件列表
for file in list:
os.chdir(filePath) # 更改当前路径
c_file = file.replace('实例名称_', '') # 这里使用的是替换的方法
os.rename(file, c_file) # 重命名
因为实际场景需要重命名两级目录下的文件名称,所以给代码增加一个for循环
import os
import PySimpleGUI as sg
filePath = sg.popup_get_folder('请选择文件所在的文件夹位置')
# filePath = r'D:\tools' # 这里是传入文件夹路径的地方
list = os.listdir(filePath)
print(list)
for file in list:
thisPath = filePath+"/"+file
os.chdir(thisPath) # 更改当前路径
list2 = os.listdir(thisPath)
for i in list2:
c_file = i.replace('实例名称_', '') # 这里使用的是替换的方法
os.rename(i, c_file) # 重命名
还可以进一步修改变层N层目录下的文件名称修改
import os
import PySimpleGUI as sg
filePath = sg.popup_get_folder('请选择文件所在的文件夹位置')
def readFilename(path, allfile):
"""
递归遍历文件夹下所有的文件
:param path:
:param allfile:
:return:
"""
files = os.listdir(path)
for file in files:
if os.path.isdir(path + '/' + file):
readFilename(path + '/' + file, allfile)
else:
allfile.append(path + '/' + file)
filelists = [] # filelists里面存放的是所有文件的列表
readFilename(filePath, filelists) # 读取文件列表
for file in filelists:
c_file = file.replace('实例名称_', '') # 这里使用的是替换的方法
os.rename(file, c_file) # 重命名
2、将相同前缀的文件压缩到一个压缩包中(将名称相同,扩展名不同的压缩成一个包)
参考其他小伙伴的实现方法(参考链接:https://blog.csdn.net/Ocean111best/article/details/103182624),在这里只增加了交互式插件
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import zipfile
import PySimpleGUI as sg
input_path = sg.popup_get_folder('请选择原始数据的文件夹位置') # 文件输入路径
output_path = sg.popup_get_folder('请选择压缩包要保存的文件夹位置') # 文件输出路径
def readFilename(path, allfile):
files = os.listdir(path)
for file in files:
if os.path.isdir(path + '/' + file):
readFilename(path + '/' + file, allfile)
else:
allfile.append(path + '/' + file)
def saveZip(input_path, output_path):
filelists = [] # filelists里面存放的是所有文件的列表
readFilename(input_path, filelists) # 读取文件列表
for num in range(len(filelists)): # 注意num是0到(len-1)的值
filename = filelists[num].split(".")[0].split("/")[-1] # 数据名称本身,如市级行政区,不包括扩展名
output_name = filename + '.zip' # 输出文件名及格式
filename_exten = filelists[num].split("/")[-1] # 文件名(包括扩展名),如xx服务区.dat,为以后数据写入压缩包做准备
if num == 0: # 当是第一个时
filename_pre = 0
else:
filename_pre = filelists[num - 1].split(".")[0].split("/")[-1] # 上一个数据名,不包括扩展名
if (filename == filename_pre) or (filename_pre == 0): # 当这个数据等于它的上一个数据或者当这个数据为第一个数据时
if num == 0: # 当是第一个数据时
f = zipfile.ZipFile(output_path + '/' + output_name, 'w', zipfile.ZIP_DEFLATED) # 文件压缩定义
f.write(filelists[num], filename_exten) # 将文件压缩,其中需要写成两个参数的样式,防止压缩包里面的文件有多个层级路径
num += 1
continue # 当该文件与它上一个文件名相同或是第一个文件时,直接进行下一次循环
f.close() # 需要结束上一次压缩,从而可以进行下一次压缩
f = zipfile.ZipFile(output_path + '/' + output_name, 'w',zipfile.ZIP_DEFLATED) # 文件压缩定义
f.write(filelists[num], filename_exten)
f.close()
if __name__ == '__main__':
saveZip(input_path, output_path)