- 论坛徽章:
- 4
|
本帖最后由 ssfjhh 于 2012-07-02 19:52 编辑
为什么CU发代码的这个<>会吃代码?
比如正则表达式我明明写的是<'\.\d+$'>
发出来以后却变成了<'\.\d+>,<$'>被吃掉了,
导致贴出的代码无法正常运行。
我经常要用proe工作,这个软件在保存的时候每次都会生产一个带有新版本号的文件,形如
abc.asm.13', 'abc.asm.14', 'abc.asm.2', 'abc.asm.3', 'abc.asm.4', 'abc.asm.5', 'abc.asm.6', 'abc.log.8', 'abc.log.9', 'abc.prt.1', 'abc.prt.10', 'abc.prt.11', 'abc.prt.12', 'abc.prt.13', 'abc.prt.14', 'abc.prt.2', 'abc.prt.3', 'abc.prt.4', 'abc.prt.5', 'abc.prt.6', 'abc.prt.7', 'abc.prt.8', 'abc.prt.9',
但是这目录下还会有其他文件夹和一些不带版本号的文件,如 'abc0', 'abc1', 'abc1.doc', 'abc1.dwg', 'abc1.dxf',
我写的这个脚本用来删除脚本所在目录以及子目录下所有旧版本的文件以及空目录,并将最新版的的文件的版本号改为1,不带版本号的文件不做处理
但是总感觉在判断旧版本的地方写得很不好,又想不出更好的办法,恳请高手给出意见,算法上的和代码编写习惯上的,只要你能给出的意见都可以因为是第一次写代码,所以脚本中尽可能多的用上了自己所掌握的技能。
代码如下:- def name(filename):
- """输入一个文件名,如果带版本号就去掉版本号,如果不带版本号,原样返回"""
- import re
- return re.sub('\.\d+,'', filename)
- def version(filename):
- """返回给出带版本号的文件名的版本号"""
- import re
- return re.sub('^.+\..+\.(?=\d+$)', '', filename)
- def chverto1(currentdir, filename):
- """将输入的版本号不为1的文件名的版本号改为1"""
- import os
- if version(filename) == '1':
- print("文件\"{}\"的最新版本为1,不需要处理".format(os.path.join(currentdir,filename)))
- else:
- oldpathname = os.path.join(currentdir, filename)
- newpathname = os.path.join(currentdir, name(filename) + '.1')
- print("文件\"{}\"的版本号被改为1".format(oldpathname))
- if os.path.exists(newpathname):
- print('正在删除旧版文件' + "\"" +newpathname +"\"")
- os.remove(newpathname)
- os.rename(oldpathname, newpathname)
- def isversionfile(filename):
- """判断给出的文件名是否带版本号"""
- import re
- if re.search('\.\d+,filename) != None:
- return True
- else:
- return False
- def sortfile(currentdir):
- """分类给出的目录,返回一个二维列表,第一个是子目录列表,第二个是带版本号文件名列表"""
- import os
- dirlist = []
- versionfilelist = []
- allfile = [dirlist, versionfilelist]
- unsortedfilelist = os.listdir(currentdir)
- print('开始分类文件夹\"' + currentdir + "\"")
- for i in unsortedfilelist:
- if os.path.isdir(os.path.join(currentdir,i)):
- dirlist.append(i)
- elif isversionfile(i):
- versionfilelist.append(i)
- else:
- print("文件\"{}\"不是带版号的文件,不需要处理".format(os.path.join(currentdir, i)))
- else:
- return allfile
- def delfiles(currentdir, versionfilelist):
- """输入一个目录和一个带版本号的文件名列表,删除所有旧版本,并将最新版的版本号改为1"""
- import os
- filecutverset = {name(i) for i in versionfilelist}
- for i in filecutverset:
- allversionofafile = []
- for j in versionfilelist:
- if i == name(j):
- allversionofafile.append(j)
- #判断不带版本号部分的文件名部分是否与已知的去掉版本部分是否一直得到一个文件的所有版本
- else:
- allversionofafile.sort()
- latestversionname = allversionofafile.pop()
- #排序同文件的不同版本,最新的版本版本号最大,处于序列的最末位置,
- #使用pop()取出最新版本文件名备用,列表中剩下的全为旧版本,应该删除
- #使用else语句,可以保证循环部分没有错误才会执行排序
- for k in allversionofafile:
- print('正在删除旧版文件' + "\"" +os.path.join(currentdir,k) +"\"")
- os.remove(os.path.join(currentdir,k))
- else:
- chverto1(currentdir, latestversionname)
- #删除列表中的所有旧文件,使用else语句,保证删除过程没有错误才会执行重命操作
- def rmof(currentdir):
- """看了这么多函数,都是为这个函数服务滴"""
- import os
- print("准备清理文件夹\"" + currentdir + "\"下的旧版本文件")
- if os.listdir(currentdir) == []:
- os.rmdir(currentdir)
- print("文件夹\"{}\"是空文件夹,删除".format(currentdir))
- return None
- else:
- dirlist, versionfilelist = sortfile(currentdir)
- #首先判断目录是否为空,避免进行不必要的操作,空目录留着何用呢,亮不犹豫的,删掉
-
- if versionfilelist == []:
- pass
- else:
- delfiles(currentdir, versionfilelist)
- #判断文件夹下是否有带版本号的文件名,有才需要进一步操作撒,没有直接pass
-
- for i in dirlist:
- print("进入文件夹\"{}\"下的子文件夹\"{}\"".format(currentdir,i))
- rmof(os.path.join(currentdir,i))
- #for循环本身就有判断作用,不需要现多作用if做判断了
- #如果存在子目录,递规调用自身,删除目录下的所有文件不费力,递规真好用呀
-
- if os.listdir(currentdir) == []:
- os.rmdir(currentdir)
- print("文件夹\"{}\"是空文件夹,删除".format(currentdir))
- #再做一次判断,避免当前目录下只有子目录,没有子文件,
- #而子目录又都是空目录,递规删除子目录后,父目录也变为空的极少情况发生,谁让咱有洁癖呢
-
- def countdown(t):
- import time
- while t:
- print(str(t) + ' ', end = '')
- t= t-1
- time.sleep(1)
- #计个数,谁能告诉我怎么实现数字在一个地方跳动的效果,貌似这个\b不行呀
- def comfirm():
- """一次要删这么多文件,本着负任的态度,必须得问问清楚用户是否真的要这么干
- 好吧,我承认,我是怕我自己误操作才写这么一段函数的"""
- import os,sys,time
- currentdir = sys.path[0]
- #脚本有可能被转成exe,如果被转成exe,上边这句该怎么写
- #我保证,你告诉我之后我就能写出脚本和exe都能正确执行的语句
- """\
- 确定要清理文件夹\"{}\"吗?
- 本脚本将会删除所有该文件夹下的旧版本文件以及空文件夹,删除操作不可恢复!!!
- """
- print("确定要清理文件夹\"{}\"吗?\n本脚本将会删除所有该文件夹下的旧版本文件以及空文件夹,删除操作不可恢复!!!".format(currentdir))
- trytimes = 3
- while trytimes:
- trytimes = trytimes -1
- getinput = input("确认操作请输入‘yes', 取消请输入'no':")
- if getinput == 'yes':
- rmof(currentdir)
- print("所有旧友版文件都已被删除,请检查!")
- input('按回车键退出')
- break
- elif getinput == 'no':
- print("操作已取消,5秒种后退出", end = '')
- countdown(5)
- break
- elif trytimes >= 1:
- print('yes or no, please!')
- print("还有{}次机会".format(trytimes,))
- else:
- print("错误次数太多,操作取消,10秒种后退出",end = '')
- countdown(10)
-
- comfirm()
复制代码 |
|