<Python编程入门经典>里面有个例子,将某目录下Log文件重命名,log->log.0,log.0->log.1,log.1->log.2,log.2->log.3 ...
两个问题,1)先处理前面的,文件会相互覆盖导致丢失
2)第一个是个无编号的文件名,有可能不存在
书里的解决方案如下
import os,shutil def make_version_path(path,version): if version==0: return path else: return path+‘.‘+str(version) def rotate(path,version=0): old_path=make_version_path(path,version) ‘‘‘ #这块可以注释掉,没有log时创建了已经 if not os.path.exists(old_path): raise IOError("‘%s‘ doesn‘t exist" %path) ‘‘‘ new_path=make_version_path(path,version+1) if os.path.exists(new_path): #new_path存在,进入 rotate,寻找不存在的 path+‘.‘+str(version+1) rotate(path,version+1) #找到后,先执行最后面的shutil.move ,再递归;在开始的连续调用中,只执行到每个函数的rotae,没到shutil.move shutil.move(old_path,new_path) def rotate_log(path): #没有文件Log,程序就创建一个 if not os.path.exists(path): new_file=open(path,‘w‘) del new_file rotate(path) rotate_log(‘/home/puma/test/log‘)
自己写个(有写地方偷懒了)
import os path=‘/home/puma/test/log‘ def rename(path,version=0): if os.path.exists(path+str(version+1)): rename(path,version+1) else: #问题在这里 os.rename(path+str(version),path+str(version+1)) if __name__==‘__main__‘: if os.path.exists(path): os.rename(path,path+‘0‘) else: with open(path+‘0‘,‘w‘) as f:pass rename(path)
执行后有问题,问题在else那里:os.rename(和shutil.move在这个程序里的功能一样)是在path+str(version+1)==False,也就是找到最大的不存在的LogX,
向回迭代时必须调用的,写了else,相当于往回迭代时就是pass,什么都没做;
正确的
import os path=‘/home/puma/test/log‘ def rename(path,version=0): if os.path.exists(path+str(version+1)): rename(path,version+1) os.rename(path+str(version),path+str(version+1)) if __name__==‘__main__‘: if os.path.exists(path): os.rename(path,path+‘0‘) else: with open(path+‘0‘,‘w‘) as f:pass rename(path)
----------------------------
ex:
def called(timer): if timer==5: pass else: called(timer+1) print ‘timer: {}‘.format(timer) called(1) 输出 timer: 4 timer: 3 timer: 2 timer: 1 #timer==5时,不会执行到 else中的print那里 def called(timer): if timer==5: pass else: called(timer+1) print ‘timer: {}‘.format(timer) called(1) 输出 timer: 5 timer: 4 timer: 3 timer: 2 timer: 1
这种doSomething在递归条件只后的,要确保 向回调用时可以执行的到
时间: 2024-10-18 05:56:50