9.8.1 选择性拷贝
1 # 选择性拷贝,遍历一个目录树,查找特定扩展名的文件,拷贝到新文件夹 2 import os, re, shutil 3 4 dirTree = input('Enter a directory:\n') # 目录树 5 extName = input('Enter a extension:\n') # 扩展名 6 newFile = input('Enter a new file:\n') # 新文件夹 7 8 regex = re.compile(r'^.*' + extName + '$') 9 10 newFile = os.path.abspath(newFile) 11 dirTree = os.path.abspath(dirTree) 12 for foldername, subfolders, filenames in os.walk(dirTree): 13 for filename in filenames: 14 if regex.search(filename): 15 shutil.copy(os.path.join(foldername, filename),newFile) 16 print('Done.')
9.8.2 删除不需要的文件
1 #! python3 2 # 删除不需要的文件 3 # 遍历一个目录树,查找大文件(夹),打印绝对路径 4 # 出现WinError5可进入管理员模式运行,如果是WinError1920还不清楚... 5 6 import os#,send2trash 7 dirTree = input('Enter a directory:\n') 8 filSize = int(input('Enter a size(Mb):\n')) 9 10 dirTree = os.path.abspath(dirTree) 11 filSize = filSize*1024*1024 12 13 14 for foldername, subfolders, filenames in os.walk(dirTree): 15 for filename in filenames: 16 if os.path.getsize(os.path.join(foldername, filename)) >= filSize: 17 print(os.path.abspath(os.path.join(foldername, filename))) 18 # send2trash.send2trash(os.path.abspath(os.path.join(foldername, filename))) 19 20 print('Done')
9.8.3 消除缺失的编号
1 #! python3 2 # 消除消失的编号 3 # 在一个文件夹中,找到所有带指定前缀的文件,定位缺失的编号 4 # 并对所有后面的文件改名,消除缺失的编号 5 import os, re, shutil 6 7 fpath = input('文件夹:\n') 8 front = input('前缀:\n') 9 exten = input('后缀(.xxx):\n') 10 start = input('起始编号:\n') 11 12 #正则表达式 13 length = len(start) 14 regex = re.compile(r'^' + front + '(\d){' + str(length) + '}' + exten + '$') 15 # 列出文件夹中文件 16 fpath = os.path.abspath(fpath) 17 flist = os.listdir(fpath) 18 start = int(start) 19 # 遍历文件 20 for filename in flist: 21 # 匹配到文件 22 if regex.search(filename): 23 mo = regex.search(filename).group(1) # 编号赋值到mo 24 if int(mo) != start: # 编号缺失 25 print('缺失编号:' + str(start).rjust(length,'0')) 26 p1 = os.path.join(fpath,filename) 27 p2 = os.path.join(fpath,front+str(start).rjust(length,'0')+exten) 28 shutil.move(p1,p2) # 改名 29 start += 1 30 print('Done')
附加练习,编写另一个程序,在一些连续编号的文件中,空出一些编号,以便加入新的文件
做这个才发现re.findall()有个关于括号的坑..
1 #! python3 2 # 空出编号 3 4 import os, re, send2trash 5 6 fpath = input('文件夹:\n') 7 front = input('前缀:\n') 8 exten = input('后缀(.xxx):\n') 9 number = input('要空出的编号(以空格分隔):\n') 10 number = number.split() 11 #正则表达式 12 length = len(number[0]) 13 regex = re.compile(r'(' + front + '(\d){' + str(length) + '}' + exten + ')') 14 # 列出文件夹中文件 15 fpath = os.path.abspath(fpath) 16 flist = os.listdir(fpath) 17 string = ' '.join(flist) 18 # 找到匹配的文件 19 strlist = regex.findall(string) 20 strlist1 = [] 21 for i in range(len(strlist)): 22 strlist1 += [strlist[i][0]] 23 # 对每一个要空出的编号遍历 24 for i in range(len(number)): 25 for filename in strlist1: 26 if int(regex.search(filename).group(2)) == int(number[i]): 27 send2trash.send2trash(os.path.join(fpath,filename)) 28 break 29 print('Done.')