文件夹批量重命名与打包

问题

体检科的方主任给我出了个问题:医院每年会组织一次健康体检,体检系统可以导出的每个的体检报告的图片放入一个“序列号+姓名”(形如:000123456_某某某)的文件夹。主任想将每个人的近三年的体检报告打包发给体检对象,但问题是,每年导出的文件命名并不一样,这导致后面的工作及其繁琐。主任的想法是将每年每人的体检报告文件夹去掉序列号,以名字开头再加年份,这样当所有文件夹重命名完成后,按名称排列,名字相同的就会聚在一起。现在她已经完成了一部分,问我有没有更好的方法。

方案

我想了一下,形如“000123456_某某某”的命名非常规律。用Python的话遍历文件,将文件夹名称当字符串处理,用str[10:]或str.split(“_”)[1]就可以名字部分截取出来,然后重命名就可以了并不麻烦。以下是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# ren.py 批量重命名文件

# 20220128

import os

addstr = input("输入添加字符串:")

files = os.listdir(".")#获取当前目录下的文件
for file in files:
if os.path.isdir(file):#如果是文件夹则
print(file.find("_"))
if(file.find("_") >0):
newFileName = file.split("_")[1] + addstr
os.rename(file, newFileName)
print(newFileName)


更多

我很快就完成了重命名的工作,但都做到了这一步我感觉可以更进一步,将打包的代码也给写了。这一层我的解决思路是这样的,遍历所有文件夹的名字,将年份去掉,放入一个集合中,这样就得到了所有体检对象的名字集合。for循环这个名字集合,再在这个循环里循环所有体检报告文件夹,当体检报告文件夹的名字包含有名字集合的名字时,将该文件夹里的所有文件拖入压缩文件中。具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# zip03.py 批量压缩文件

# 20220128

import os
from zipfile import ZipFile

files = os.listdir(".")#获取当前目录下的文件

fileSet = set()
for file in files:
if os.path.isdir(file):#如果是文件夹则
file = file[:-4]
fileSet.add(file)

def get_zip_file(input_path, result):
"""
对目录进行深度优先遍历
:param input_path:
:param result:
:return:
"""
files = os.listdir(input_path)
for file in files:
if os.path.isdir(input_path + '/' + file):
get_zip_file(input_path + '/' + file, result)
else:
result.append(input_path + '/' + file)

for fs in fileSet:
fzip = fs + ".zip"
with ZipFile(fzip, 'w') as myzip:
#filelists = []
for file in files:
if os.path.isdir(file):#如果是文件夹则
if fs in file:
filelists = []
get_zip_file(file, filelists)
for f in filelists:
myzip.write(f)

最后

这就样,我解决了方主任的烦恼,其实我想更进一步的将发邮件这步也给实现了,但我对医院的OA系统是在没有过多的研究,只得作罢了。