2011-09-01 96 views
0

我写了一个小脚本,我需要在脚本所在的同一文件夹中重命名和排序文件。它重命名文件到基于文件的最后修改整数(1,2,3,4,...):用于排序和重命名文件的Python脚本 - 删除重复项

import os 
import sys 
def gtime(nam): 
    return os.path.getmtime('./'+nam) 
files = os.listdir('.') 
files.remove(str(sys.argv[0])[2:]) 
files = sorted(files, key=gtime) 
for fi in range(len(files)): 
    os.rename('./'+files[fi], './'+str(fi+1)) 

这是我想出来的最好这样做...问题是什么时候有一个重复的(例如,一个文件已经命名为1,也许从以前的排序)它只是删除它。我怎样才能防止这种情况发生?是否有任何修改,我可以做的代码或更好的替代方法?

+2

为什么你需要这样做?你的“如何?”的答案将通过“为什么?”的答案来通知。 – MattH

+0

我的一个朋友有一些文件夹,其中包含文件(记录或文档文件的种类),并需要保留较旧的文件...也许其他脚本可能会添加到这些较旧的文件,因此需要一种模式来区分文件的新增内容被修改了,我认为用这种方式重命名它们会容易得多... – amyassin

+1

当然,使用按mod时间排序的文件浏览器会更容易一些吗? – MattH

回答

1

您不能重命名一个文件,因为您可能会在过程中覆盖已排序的文件。但是,您可以先使用临时名称,然后在第二次重命名文件到其最终的名称:

import os 
import sys 
def gtime(nam): 
    return os.path.getmtime('./'+nam) 
files = os.listdir('.') 
files.remove(str(sys.argv[0])[2:]) 
files = sorted(files, key=gtime) 
for fi, file in enumerate(files): 
    os.rename(file, str(fi+1)+".tmp") 
for fi in range(len(files)): 
    os.rename(str(fi+1)+".tmp", str(fi+1)) 

(未经测试)

+0

好主意!不知道它怎么没有出现在我的脑海里... thnx – amyassin

+0

感谢@Niklas ,,它的工作 – amyassin

0
import os.path 
for fi in range(len(files)): 
    if os.path.exists(str(fi+1)): 
     print("Prevent that from happening") # whatever you want to do here 
    else: 
     os.rename(files[fi], str(fi+1)) 
+0

如何'防止发生'?? – amyassin

2

所以这里是一个将复制到一个子目录,并避免将你的脚本示例还有.pyc文件。

import os, sys 
from os.path import exists, isfile, getmtime, join as pjoin 
from shutil import copyfile 

targetdir='process' 
stub='inputfile' 

if not exists(targetdir): 
    os.mkdir(targetdir) 

files = [ x for x in os.listdir('.') if isfile(pjoin('.',x)) and not x.startswith(sys.argv[0]) ] 
pad = len(files)/10 + 1 
for i,f in enumerate(sorted(files,key=lambda x: getmtime(pjoin('.',x)))): 
    copytarget = pjoin('.',targetdir,"%s-%0.*d" % (stub,pad,i)) 
    print "Copying %s to %s" % (f,copytarget) 
    copyfile(f,copytarget) 
+0

+1避免.pyc文件...我不知道它,并想知道为什么另一个脚本副本出现... – amyassin

+0

@amyassin:我真的不明白“避免.pyc文件”的含义吗?这些文件只是由CPython临时创建的,如果删除,将很乐意重新创建。 –

+0

@Niklas有时(我不知道什么时候)当我做排序的时候,当重命名首先它被重命名并被赋予一个新的名字并且被排序为一个文件,所以我得到另一个文件(一个副本 - 不完全确切 - 的脚本)...我试图阅读更多关于,但通过'而不是x.startswith(sys.argv [0])'它已解决... – amyassin