用于排序和重命名文件的Python脚本 - 删除重复项

时间:2011-09-01 09:19:09

标签: python sorting file-rename

我写了一个小脚本,我需要在脚本所在的同一文件夹中重命名和排序文件。它根据文件的最后修改将文件重命名为整数(1,2,3,4,...):

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,可能来自之前的排序)它只是删除它..我怎样才能防止这发生了什么?我可以对代码进行任何修改或更好的替代方式吗?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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))

(未测试的)

答案 2 :(得分: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))